Quelle est la différence entre les expressions Python suivantes:
# First:
x,y = y,x+y
# Second:
x = y
y = x+y
First donne des résultats différents de Second .
par exemple.,
Premier:
>>> x = 1
>>> y = 2
>>> x,y = y,x+y
>>> x
2
>>> y
3
Seconde:
>>> x = 1
>>> y = 2
>>> x = y
>>> y = x+y
>>> x
2
>>> y
4
y est 3 dans premier et 4 dans deuxième
Dans une instruction d'affectation, le membre de droite est toujours pleinement évalué avant lors du paramétrage effectif des variables. Alors,
x, y = y, x + y
évalue y
(appelons le résultat ham
), évalue x + y
(appelez spam
), then définit x
à ham
et y
à spam
. C'est à dire
ham = y
spam = x + y
x = ham
y = spam
Par contre,
x = y
y = x + y
définit x
sur y
, puis définit y
sur x
(quel == y
) plus y
, il est donc équivalent à
x = y
y = y + y
Il est expliqué dans la documentation dans la section "Commande d'évaluation" :
... lors de l'évaluation d'une tâche, le membre de droite est évalué avant le côté gauche.
La première expression:
y,x+y
x
et y
La deuxième instruction est en fait deux expressions, sans l'utilisation de Tuple.
La surprise est que la première expression est en réalité:
temp=x
x=y
y=temp+y
Vous pouvez en apprendre plus sur l’utilisation de virgule dans " Formulaires entre parenthèses ".
Dans le second cas, vous affectez x+y
à x
Dans le premier cas, le deuxième résultat (x+y
) est attribué à y
C'est pourquoi vous obtenez des résultats différents.
Après votre édition
Cela se produit parce que, dans la déclaration
x,y = y,x+y
toutes les variables du membre de droite sont évaluées, puis stockées dans les membres de gauche. So first continue avec le membre droit et second avec le membre gauche.
Dans la deuxième déclaration
x = y
y = x + y
vous avez d'abord évalué y
et l'assignez à x
; De cette façon, la somme de x+y
équivaut à une somme de y+y
et non de x+x
qui est le premier cas.
Le premier est une tâche de type Tuple:
x,y = y,x+y
Où x
est le premier élément du tuple, et y
est le deuxième élément. Ainsi, vous procédez comme suit:
x = y
y = x+y
Wheras le second fait une cession directe:
x=y
x=x+y
a, b = 0, 1
while b < 10:
print(b)
a, b = b, a+b
Sortie
1
1
2
3
5
8
les variables a et b obtiennent simultanément les nouvelles valeurs 0 et 1, les mêmes a, b = b, a + b, a et b sont affectés simultanément.
Parlons la différence.
x, y = y, x + y
Il s'agit de x Tuple xssignment, mexns (x, y) = (y, x + y)
, tout comme (x, y) = (y, x)
Stxrt de x exemple rapide:
x, y = 0, 1
#equivxlent to
(x, y) = (0, 1)
#implement xs
x = 0
y = 1
Quand arrive à (x, y) = (y, x + y)
ExFP, x essaie directement
x, y = 0, 1
x = y #x=y=1
y = x + y #y=1+1
#output
In [87]: x
Out[87]: 1
In [88]: y
Out[88]: 2
Cependant,
In [93]: x, y = y, x+y
In [94]: x
Out[94]: 3
In [95]: y
Out[95]: 5
Le résultat est différent du premier essai.
Thx est parce que Python évalue d’abord le x+y
de droite. Cela équivaut à:
old_x = x
old_y = y
c = old_x + old_y
x = old_y
y = c
En résumé, x, y = y, x+y
signifie,x
échange pour obtenir old_value of y
,y
échange pour obtenir la somme de l'ancienne valeur x
et de l'ancienne valeur y
,
J'ai récemment commencé à utiliser Python et cette "fonctionnalité" m'a dérouté. Bien qu'il y ait beaucoup de réponses données, je posterai quand même ma compréhension.
Si je veux échanger les valeurs de deux variables, dans JavaScipt, je procéderais comme suit:
var a = 0;
var b = 1;
var temp = a;
a = b;
b = temp;
J'aurais besoin d'une troisième variable pour conserver temporairement l'une des valeurs. Un échange très simple ne fonctionnerait pas, car les deux variables se retrouveraient avec la même valeur.
var a = 0;
var b = 1;
a = b; // b = 1 => a = 1
b = a; // a = 1 => b = 1
Imaginez que vous ayez deux seaux différents (rouge et bleu) et deux liquides différents (eau et huile). Maintenant, essayez d’échanger les seaux/liquides (eau en bleu et huile dans un seau rouge). Vous ne pouvez le faire que si vous avez un seau supplémentaire.
Python traite cela avec une solution/solution "plus propre": Attribution des tuples .
a = 0
b = 1
print(a, b) # 0 1
# temp = a
# a = b
# b = temp
a, b = b, a # values are swapped
print(a, b) # 1 0
Je suppose que de cette façon, Python crée les variables "temp" automatiquement et nous n'avons pas à nous en soucier.