2011-08-10 26 views
16

Herkes genellikle sadece bir karşılaştırma amaçlandığı zaman Python ödevlerde if tablolarda atamaları engellemek için muhtemelen, bir değer döndürmek olmadığını bilir Aynı ifadedeki ödevler de sözdizimi hatalarıydı.Atama deyimi değeri

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

Yani, benim sorum: Aslında

, a = (b = 2) geçerli bir ifade değil neden Python a = b = 2 eserler o C gibi, atama ifadeleri bir değere sahip diğer dillerde çalışmaktadır olarak?

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

Bu davranış belgelendi mi? Ben atama deyimi belgelerinde bu konuda bir şey bulunmadı: http://docs.python.org/reference/simple_stmts.html#assignment-statements

cevap

24

Bu sözdiziminde doğru var:

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

(target_list "=")+ sonunda minik + "bir veya daha fazla" anlamına gelir. Bu nedenle a = b = c = 2 hattı 3 atama ifadesinden oluşmaz, ancak 3 hedef listeyle tek bir atama ifadesinden oluşur. Her bir hedef liste, yalnızca tek bir hedeften oluşur (bu durumda bir tanımlayıcı).

Bu metin (vurgu mayın) de bulunan:

bir atama deyimi [...] hedefin her soldan sağa, listeler tek çıkan nesneyi atar.

Bu ilginç sonuçlara yol açabilir:

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

Başka güzel bir örneğidir:

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