2011-10-12 12 views
11

Rozważmy następujący program Python3:Python operator przypisania asocjatywność

a = [0, 0] 
i = 0 
a[i] = i = 1 
print(a, i) 

a = [0, 0] 
i = 0 
i = a[i] = 1 
print(a, i) 

Spodziewałem wyjściowy będzie:

[0, 1] 1 
[1, 0] 1 

Ale zamiast tego mam:

[1, 0] 1 
[0, 1] 1 

Moje pytanie brzmi: czy jest coś w specyfikacji języka Python na temat asocjatywności operatora przypisania, lub jest zachowanie dla a bove przykład niezdefiniowany?

Wszystko, co udało mi się znaleźć, to że wyrażenia są oceniane od lewej do prawej, z tą różnicą, że wartość r jest oceniana jako pierwsza w przypadku przypisania, ale to nie pomaga.

+1

ciekawe, Twój przykład jest bardzo podobny do przykładu w [końcu sekcji] (http://docs.python.org/release/ 3.0.1/reference/simple_stmts.html # przypisania-przypisania). –

Odpowiedz

12

Krótka odpowiedź: kod jest dobrze zdefiniowany; kolejność jest od lewej do prawej.

Długa odpowiedź:

Przede wszystkim, przejdźmy terminologii rację. W przeciwieństwie do innych języków, przypisanie w języku Python to oświadczenie, a nie operator operatora . Oznacza to, że nie możesz użyć przypisania jako części innego wyrażenia: na przykład i = (j = 0) nie jest prawidłowym kodem Pythona.

Instrukcja przypisania jest zdefiniowana tak, aby wyraźnie zezwalać na wiele celów przypisania (w twoim przykładzie są to i i a[i]). Każdy cel może być listą, ale zostawmy to na boku.

W przypadku wielu celów przypisania wartość jest przypisywana od lewej do prawej. Zacytować documentation:

Instrukcja przypisania ocenia listy ekspresji (pamiętać, że może być pojedynczym ekspresyjny lub listą oddzielonych, drugi otrzymując krotki) i przydziela jeden wynikowy sobie z list docelowych, od lewej do prawej.

7

Po to, aby było jasne, ponieważ starałem się to zrozumieć. Oświadczenie:

a = b = c = ... = E 

jest równoważna

a = E 
b = E 
c = E 
... 
Powiązane problemy