2016-09-03 8 views
1

ли назначениеНазначает a, b = c, a такое же, как b, a = a, c?

a,b = c,a 

же, как

b,a = a,c 

Вроде бы то же самое для простого случая, когда a, b и c являются числами.

Есть ли случай, когда это не удается?

+0

Это то же самое независимо от того, что – iScrE4m

+0

Вы полностью изменили вопрос. Теперь вы включили * назначение атрибутов на один и тот же объект *. Назначение происходит слева направо, и у вас есть ** две 'a' ссылки ** в левой части (одна с атрибутом). –

+0

Я откат вашего редактирования, потому что вы заменили 'a, b = c, a' на' a, a.b = c, a', что * не то же самое *. –

ответ

5

Нет, нет случая, когда это не удастся. Эти два утверждения являются в точности эквивалентными, поскольку a и b являются независимыми.

Это потому, что значения правой части помещаются в стек сначала перед назначением (слева направо). Присвоение a до b не имеет значения, потому что a и b - совершенно разные имена, а присвоение одному из них не влияет на другое.

Итак первое утверждение:

a,b = c,a 

выполняется как (псевдо-байткод *)

PUSH C ON STACK 
PUSH A ON STACK 
SWAP TOP TWO VALUES OF STACK 
POP TOP OF STACK, STORE IN A 
POP TOP OF STACK, STORE IN B 

в то время как второй

b,a = a,c 

выполнен в виде

PUSH A ON STACK 
PUSH C ON STACK 
SWAP TOP TWO VALUES OF STACK 
POP TOP OF STACK, STORE IN B 
POP TOP OF STACK, STORE IN A 

Не имеет значения, к какому типу относятся значения, указанные a, b или c.

Вещи могут стать более запутанными, если вы были до chain assignments и/или mix in subscriptions. Во всех этих случаях присваиваемые имена не являются независимыми, и люди обычно не понимают, что все присвоения имеют место после, и выполнено это право слева направо.


* См How does swapping of members in the python tuples (a,b)=(b,a) work internally? для реальных примеров байткодом.

+0

Не могли бы вы посмотреть мои изменения? – Kevin

+0

@Renegade: внимательно прочитайте мой ответ: * значения правой стороны помещаются в стек сначала перед назначением (слева направо). * Поэтому, когда вы назначаете 'current, current.node' слева направо , как вы думаете, 'current.node' к тому моменту, когда выполнено первое присвоение' current'? –

1

Это то же самое во всех случаях, независимо от того, с чем вы работаете. Пока утверждения эквивалентны (как и ваши), результат будет таким же.

0

Краткое сообщение ----- «Да» .. a, b = c, a означает a = c и b = a ... b, a = a, c означает b = a и a = c

Смежные вопросы