2011-08-10 11 views
16

みんなは通常、ちょうど比較が意図されている場合、Pythonの割り当てにif書類に割り当てを避けるために、おそらく、値を返さないことを知っています同じステートメントの代入は構文エラーでもありました。代入文の値

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

だから、私の質問は次のとおりです:実際には

は、a = (b = 2)は有効な式ではありません、なぜPythonでa = b = 2作品、それは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つの代入ステートメントではなく、の1つの代入ステートメントと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)