31

我正在阅读 Python 文档(http://docs.python.org/reference/simple_stmts.html#assignment-statements)中的赋值语句。

其中引述如下:

如果目标是括在括号或方括号中的目标列表:该对象必须是与目标列表中的目标具有相同数量的项目的可迭代对象,并且其项目从左到右分配给相应的目标。

看完之后,我想到了写一个这样的示例:

a = 5
b = 4
a, b = a + b, a
print a, b

我的假设是 a 和 b 的值都应该是 9。

然而,事实证明我错了。“a”的值为 9,“b”的值为 5。

有人可以帮助我更好地理解这一点吗?为什么分配“a”的旧值而不是新值?根据文档,将首先分配 a 的值,对吗?我错过了什么吗?

4

3 回答 3

38

在进行任何赋值之前,赋值运算符右侧的所有表达式都会被计算。

来自Python 教程:编程的第一步

第一行包含一个多重赋值:变量 a 和 b 同时获得新值 0 和 1。在最后一行再次使用它,表明右侧的表达式在任何赋值之前都首先被计算发生。右侧的表达式从左到右计算。

强调我的。

您的代码在功能上等同于以下内容:

a, b = 5 + 4, 5
print a, b
于 2012-07-16T10:15:21.620 回答
26

Python 没有 C 中的“逗号运算符”。相反,逗号表示应该构造一个元组。的右侧

a, b = a + b, a

是一个包含 th 和 的两个项目的元a + ba

在分配的左侧,逗号表示应根据您引用的规则执行序列解包:a将分配元组的第一个元素,b第二个元素。

于 2012-07-16T10:16:29.717 回答
21

您可以认为分配在副本上并行发生,而不是按顺序和就地发生。

这就是为什么在 python 中你不需要交换函数:

a, b = b, a

无需临时变量即可充分工作,c.

于 2012-07-16T10:15:49.047 回答