2012-01-04 8 views
24

¿Cuál es la diferencia entre las siguientes expresiones Python:múltiple orden de asignación y evaluación en Python

# First: 

x,y = y,x+y 

# Second: 

x = y 
y = x+y 

Primera da resultados diferentes que Segunda.

por ejemplo,

Primero:

>>> x = 1 
>>> y = 2 
>>> x,y = y,x+y 
>>> x 
2 
>>> y 
3 

Segundo:

>>> x = 1 
>>> y = 2 
>>> x = y 
>>> y = x+y 
>>> x 
2 
>>> y 
4 

y es 3 en Primera y 4 en Segunda

+2

No es sorprendente. ¿Por qué esperabas que produjeran el mismo resultado? ¿Puedes explicar tu razonamiento? –

+0

Acabo de editar mi pregunta ...: P fue mi culpa ... – rafuru

+0

Eso no explica su razonamiento. ¿Puedes explicar por qué pensaste que podrían dar el mismo resultado? –

Respuesta

41

En una declaración de asignación, el lado derecho siempre se evalúa completamente antes de haciendo la configuración real de las variables. Así,

x, y = y, x + y 

evalúa y (vamos a llamarlo el resultado ham), evalúa x + y (llamada que spam), luego conjuntos x a ham y y a spam. Es decir, es como

ham = y 
spam = x + y 
x = ham 
y = spam 

Por el contrario,

x = y 
y = x + y 

conjuntos x-y, a continuación, establece y-x (que == y) más y, por lo que es equivalente a

x = y 
y = y + y 
1

En el segundo caso, se asignan a x+yx

En el primer caso, el segundo resultado (x+y) se asigna a y

Es por esto que obtenga resultados diferentes.

Después de su edición

Esto sucede porque, en la declaración se evalúan

x,y = y,x+y 

todas las variables en el miembro de la derecha y, a continuación, se almacenan en los miembros izquierdos. Entonces primero proceda con el miembro derecho, y segundo con el miembro izquierdo.

En la segunda sentencia

x = y 
y = x + y 

yo calcula primero y y asignarlo a x; de esta forma, la suma de x+y es equivalente a una suma de y+y y no de x+x que es el primer caso.

1

La primera de ellas es una tupla como misión:

x,y = y,x+y 

Dónde x es el primer elemento de la tupla, y y es el segundo elemento, por lo tanto lo que está haciendo es:

x = y 
y = x+y 

Wheras el segundo está haciendo un Asignar recta:

x=y 
x=x+y 
3

La primera expresión:

  1. Crea una tupla temporal con valor y,x+y
  2. asignado a otra tupla temporal
  3. Extraer la tupla a variables x y y

La segunda declaración es en realidad dos expresiones, sin el uso de tupla.

La sorpresa es decir, la primera expresión es en realidad:

temp=x 
x=y 
y=temp+y 

Usted puede aprender más sobre el uso de la coma en "Parenthesized forms".

+0

no son equivalentes, el primero es 'x = y',' y = x + y', tipearlo en python :) – Serdalis

+0

@Serdalis Yak Lo perdí – Abhijit

+0

¡¡Gracias !! Su respuesta y la de @Iarsmans fueron muy claras: P – rafuru

8

Se se explica en los documentos en la sección titulada "Evaluation order":

... al evaluar una tarea, el lado derecho se evalúa antes del lado izquierdo.

0
a, b = 0, 1 
while b < 10: 
print(b) 
a, b = b, a+b 

salida

1 
1 
2 
3 
5 
8 

la variables a y b conseguir simultáneamente los nuevos valores de 0 y 1, el mismo a, b = b, a + b, a y b son asignar simultáneamente.

0

Digamos la diferencia.

x, y = y, x + y Es x xssignment tupla, mexns (x, y) = (y, x + y), al igual que (x, y) = (y, x)

Stxrt desde x ejemplo rápido:

x, y = 0, 1 
#equivxlent to 
(x, y) = (0, 1) 
#implement xs 
x = 0 
y = 1 

Cuando viene a (x, y) = (y, x + y) ExFP, tienen x tratar directamente

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 

Sin embargo,

In [93]: x, y = y, x+y 
In [94]: x 
Out[94]: 3 
In [95]: y 
Out[95]: 5 

El resultado es diferente al primer intento.

Thx es porque Python evalúa en primer lugar el derecho x+y Por lo tanto, equivxlent a:

old_x = x 
old_y = y 
c = old_x + old_y 
x = old_y 
y = c 

En resumen, x, y = y, x+y medios,
x intercambios de conseguir old_value de y,
y intercambios para obtener el suma del valor anterior x y valor anterior y,

0

I ' Recientemente comencé a usar Python y esta "característica" me desconcertó. Aunque hay muchas respuestas dadas, publicaré mi entendimiento de todos modos.

Si quiero cambiar los valores de dos variables, en JavaScript, yo haría lo siguiente:

var a = 0; 
var b = 1; 

var temp = a; 
a = b; 
b = temp; 

que había necesidad de una tercera variable para contener temporalmente uno de los valores. Un intercambio muy directo no funcionaría, porque las dos variables terminarían con el mismo valor.

var a = 0; 
var b = 1; 

a = b; // b = 1 => a = 1 
b = a; // a = 1 => b = 1 

Imagine tener dos cubos diferentes (rojo y azul) y que tiene dos líquidos diferentes (agua y aceite) en ellos, respectivamente. Ahora, intente cambiar los cubos/líquidos (agua en azul y aceite en cubo rojo). No puedes hacerlo a menos que tengas un cubo extra.

Python se ocupa de esto con una solución/forma "limpia": Tuple Assignment.

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 

Creo que Python está creando automáticamente las variables "temp" y no tenemos que preocuparnos por ellas.

Cuestiones relacionadas