2011-08-10 75 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)