Il en résulterait le même sólo si la fonction n'a pas d'effets secondaires et renvoie un singleton de manière déterministe (compte tenu de ses entrées).
Par exemple :
def is_computer_on():
return True
x = y = is_computer_on()
ou
def get_that_constant():
return some_immutable_global_constant
Notez que le résultat serait le même, mais que le processus pour y parvenir ne le serait pas :
def slow_is_computer_on():
sleep(10)
return True
Le contenu des variables x et y serait le même, mais l'instruction x = y = slow_is_computer_on()
durerait 10 secondes, et son homologue x = slow_is_computer_on() ; y = slow_is_computer_on()
durerait 20 secondes.
Ce serait presque la même chose si la fonction n'a pas d'effets secondaires et renvoie un immuable de manière déterministe (compte tenu de ses entrées).
Par exemple :
def count_three(i):
return (i+1, i+2, i+3)
x = y = count_three(42)
Notez que les mêmes captures expliquées dans la section précédente s'appliquent.
Pourquoi je dis presque ? A cause de ça :
x = y = count_three(42)
x is y # <- is True
x = count_three(42)
y = count_three(42)
x is y # <- is False
Ok, en utilisant is
est quelque chose d'étrange, mais cela illustre que le retour n'est pas le même. Ceci est important pour le cas mutable :
C'est dangereux et peut conduire à des bogues si la fonction retourne un objet mutable.
Cette question a également reçu une réponse. Dans un souci d'exhaustivité, je rejoue l'argument :
def mutable_count_three(i):
return [i+1, i+2, i+3]
x = y = mutable_count_three(i)
Parce que dans ce scénario x
y y
sont le même objet, faire une opération comme x.append(42)
ce qui signifie que les deux x
y y
contient une référence à une liste qui a maintenant 4 éléments.
Il n'en serait pas de même si la fonction avait des effets secondaires.
Considérer l'impression comme un effet secondaire (ce que je trouve valable, mais d'autres exemples peuvent être utilisés à la place) :
def is_computer_on_with_side_effect():
print "Hello world, I have been called!"
return True
x = y = is_computer_on_with_side_effect() # One print
# The following are *two* prints:
x = is_computer_on_with_side_effect()
y = is_computer_on_with_side_effect()
Au lieu d'une impression, il peut s'agir d'un effet secondaire plus complexe ou plus subtil, mais le fait demeure : la méthode est appelée une ou deux fois et cela peut entraîner un comportement différent.
Il n'en serait pas de même si la fonction est non déterministe compte tenu de ses entrées
Peut-être une simple méthode aléatoire :
def throw_dice():
# This is a 2d6 throw:
return random.randint(1,6) + random.randint(1,6)
x = y = throw_dice() # x and y will have the same value
# The following may lead to different values:
x = throw_dice()
y = throw_dice()
Mais les choses liées à l'horloge, aux compteurs globaux, au système, etc. sont susceptibles d'être non déterministes étant donné l'entrée, et dans ces cas, la valeur de x
y y
peuvent diverger.
6 votes
Vous pouvez utiliser l'option
python
au lieu depython-3.x
puisqu'il est plus largement suivi et que votre question n'est pas spécifique à Python 3. Vous n'avez pas non plus besoin de répéter la balise dans le titre, mais il est bon de mentionner votre version de Python quelque part.