ли назначениеНазначает a, b = c, a такое же, как b, a = a, c?
a,b = c,a
же, как
b,a = a,c
Вроде бы то же самое для простого случая, когда a
, b
и c
являются числами.
Есть ли случай, когда это не удается?
ли назначениеНазначает a, b = c, a такое же, как b, a = a, c?
a,b = c,a
же, как
b,a = a,c
Вроде бы то же самое для простого случая, когда a
, b
и c
являются числами.
Есть ли случай, когда это не удается?
Нет, нет случая, когда это не удастся. Эти два утверждения являются в точности эквивалентными, поскольку 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? для реальных примеров байткодом.
Не могли бы вы посмотреть мои изменения? – Kevin
@Renegade: внимательно прочитайте мой ответ: * значения правой стороны помещаются в стек сначала перед назначением (слева направо). * Поэтому, когда вы назначаете 'current, current.node' слева направо , как вы думаете, 'current.node' к тому моменту, когда выполнено первое присвоение' current'? –
Это то же самое во всех случаях, независимо от того, с чем вы работаете. Пока утверждения эквивалентны (как и ваши), результат будет таким же.
Краткое сообщение ----- «Да» .. a, b = c, a означает a = c и b = a ... b, a = a, c означает b = a и a = c
Это то же самое независимо от того, что – iScrE4m
Вы полностью изменили вопрос. Теперь вы включили * назначение атрибутов на один и тот же объект *. Назначение происходит слева направо, и у вас есть ** две 'a' ссылки ** в левой части (одна с атрибутом). –
Я откат вашего редактирования, потому что вы заменили 'a, b = c, a' на' a, a.b = c, a', что * не то же самое *. –