2011-08-10 33 views
16

Todo el mundo sabe que en las asignaciones de Python no devuelve un valor, presumiblemente para evitar asignaciones en if declaraciones cuando por lo general sólo una comparación tiene por objeto:asignación de valor comunicado

>>> if a = b: 
    File "<stdin>", line 1 
    if a = b: 
     ^
SyntaxError: invalid syntax 

>>> if a == b: 
...  pass 
... 

Por la misma razón, se podría sospechar que múltiples las asignaciones en la misma instrucción también fueron errores de sintaxis.

De hecho, a = (b = 2) no es una expresión válida:

>>> a = (b = 2) 
    File "<stdin>", line 1 
    a = (b = 2) 
     ^
SyntaxError: invalid syntax 

lo tanto, mi pregunta es: ¿por qué a = b = 2 obras en Python, ya que funciona en otros idiomas, donde las instrucciones de asignación tienen un valor, al igual que C?

>>> a = b = c = 2 
>>> a, b, c 
(2, 2, 2) 

¿Este acto está documentado? No podía encontrado nada sobre esto en la documentación de instrucción de asignación: http://docs.python.org/reference/simple_stmts.html#assignment-statements

Respuesta

24

Es allí mismo, en la sintaxis:

assignment_stmt ::= (target_list "=")+ (expression_list | yield_expression) 

La pequeña + al final de (target_list "=")+ significa "uno o más". Por lo tanto, la línea a = b = c = 2 no consta de 3 instrucciones de asignación, sino de una única declaración de asignación con 3 listas de objetivos.

Cada lista de destino a su vez consiste solo de un único objetivo (un identificador en este caso).

Es también en el texto (el énfasis es mío):

una instrucción de asignación [...] asigna el objeto resultante única a cada del objetivo enumera, de izquierda a derecha.

Esto puede conducir a resultados interesantes:

>>> (a,b) = c = (1,2) 
>>> (a, b, c) 
(1, 2, (1, 2)) 
-1
a = b = c = 2 
b = 3 
print a,b,c 
>>> 2 3 2 
0

Otro buen ejemplo:

>>a,b,c = b = 1,2,3 
>>b 
(1, 2, 3) 
Cuestiones relacionadas