web-dev-qa-db-fra.com

Assignation multiple et ordre d'évaluation en Python

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

36
rafuru

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
62
Fred Foo

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.

11
unutbu

La première expression:

  1. Crée un tuple temporaire avec la valeur y,x+y
  2. Assigné à un autre tuple temporaire
  3. Extraire le tuple dans les variables 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 ".

4
Abhijit

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.

1
DonCallisto

Le premier est une tâche de type Tuple:

x,y = y,x+y

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
1
Serdalis
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. 

0
li bing zhao

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+yde 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,

0
JawSaw

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.

0
akinuri