2011-08-10 101 views
16

大家都知道,在Python分配不返回值,大概是为了避免if报表任务时,通常只是一个比较的目的是:赋值语句值

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

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

出于同样的原因,人们可以怀疑多在同一个语句上的赋值也是语法错误。

事实上,a = (b = 2)是不是一个有效的表达式:

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

所以,我的问题是:为什么a = b = 2作品在Python,因为它的工作原理在赋值语句具有价值的其他语言,如C?

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

此行为是否记录在案?我无法找到这事的赋值语句文档中:http://docs.python.org/reference/simple_stmts.html#assignment-statements

回答

24

这是正确的,在语法:

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

(target_list "=")+年底微小+意味着“一个或多个”。所以行a = b = c = 2不包含3个赋值语句,而是单个赋值语句带有3个目标列表。

每个目标列表依次只包含一个目标(本例中是标识符)。

这也是在文本(重点煤矿):

赋值语句[...]单一的所得对象分配给每个目标列出,由左到右。

这可能会导致一些有趣的结果:

>>> (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

另一个很好的例子:

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