2011-08-10 11 views
16

Każdy wie, że w zadaniach Pythona nie zwraca wartości, prawdopodobnie, aby uniknąć przypisania na if sprawozdania kiedy zazwyczaj tylko porównanie jest przeznaczony:Przypisanie wartości oświadczenie

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

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

Z tego samego powodu, można podejrzewać, że wiele przypisania w tej samej instrukcji były również błędami składni.

W rzeczywistości a = (b = 2) nie jest poprawnym wyrażeniem:

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

Więc moje pytanie brzmi: dlaczego a = b = 2 prace w Pythonie, jak to działa w innych językach, gdzie instrukcje przypisania mają wartość, jak C?

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

Czy to zachowanie zostało udokumentowane? Nie mogłem znaleźć nic na ten temat w dokumentacji instrukcji przypisania: http://docs.python.org/reference/simple_stmts.html#assignment-statements

Odpowiedz

24

To właśnie tam w składni:

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

Maleńki + na koniec (target_list "=")+ oznacza „jeden lub więcej”. Zatem linia a = b = c = 2 nie składa się z 3 instrukcji przypisania, ale z z pojedynczą instrukcją przypisania z 3 listami docelowymi.

Każda lista celów z kolei składa się tylko z jednego celu (w tym przypadku jest to identyfikator).

Jest to także w tekście (kopalni nacisk):

Instrukcja przypisania [...] przypisuje pojedynczy obiekt wynikowy do każdej tarczy wymienia, od lewej do prawej.

może to prowadzić do interesujących wyników:

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

Innym dobrym przykładem:

>>a,b,c = b = 1,2,3 
>>b 
(1, 2, 3) 
Powiązane problemy