正在分配
a,b = c,a
和
一样b,a = a,c
对于 a、b 和 c 是数字的简单情况似乎是相同的。
有没有失败的情况?
请您参考如下方法:
不,没有失败的情况。这两个语句完全等价,因为 a 和 b 独立。
这是因为在赋值发生之前,右侧的值首先被放入堆栈(从左到右)。在 b 之前分配给 a 没有区别,因为 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?对于实际的字节码示例。
