【问题标题】:Is assigning a,b = c,a the same as b,a = a,c?分配 a,b = c,a 是否与 b,a = a,c 相同?
【发布时间】:2016-09-03 18:06:28
【问题描述】:

正在分配

a,b = c,a

一样
b,a = a,c

abc 是数字的简单情况似乎相同。

有没有失败的情况?

【问题讨论】:

  • 无论如何都一样
  • 你完全改变了问题。您现在包含同一对象的属性分配。分配从左到右进行,您的左侧有 两个 a 引用(一个带有属性)。
  • 我已回滚您的编辑,因为您将 a, b = c, a 替换为 a, a.b = c, a,这到目前为止不是一回事
  • @Renegade:我已经解决了您面临的问题;这里要记住的重要一点是,右侧是首先评估,然后分配是从左到右进行的。
  • @Renegade:你的“真正的问题”是Python Assignment Operator Precedence - (a, b) = a[b] = {}, 5的重复,真的。

标签: python python-2.7


【解决方案1】:

不,没有失败的情况。这两个语句完全相同,因为ab独立的

这是因为右侧的值在赋值发生之前首先被放入堆栈(从左到右)。在b 之前分配给a 没有区别,因为ab 是完全不同的名称,并且首先分配给其中一个不会影响另一个。

所以第一个语句:

a,b = c,a

被执行为 (psuedo-bytecode*)

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

abc 引用的值是什么类型并不重要。

如果您使用chain assignments 和/或mix in subscriptions,事情会变得更加混乱。在所有这些情况下,被分配的名称不是独立的,人们通常没有意识到所有的分配都发生在 右侧表达式已经执行并且分配发生在从左到在那之后。


* 请参阅How does swapping of members in the python tuples (a,b)=(b,a) work internally? 了解实际的字节码示例。

【讨论】:

  • @Renegade:仔细阅读我的回答:在赋值发生之前(从左到右),右侧的值首先被放入堆栈。所以当你赋值时到current, current.node 从左到右,你认为current.node 第一次分配给current 的时间是多少?
【解决方案2】:

在所有情况下都是一样的,无论您使用的是什么。只要语句是等价的(就像你的一样),结果就会是一样的。

【讨论】:

    【解决方案3】:

    简短回答-----“是”.. a,b = c,a 表示 a=c 和 b=a ... b,a = a,c 表示 b=a 和 a=c

    【讨论】: