Python的逗号运算符在赋值期间如何工作?

时间:2012-07-16 10:13:09

标签: python tuples variable-assignment comma

我正在阅读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'而不是新值?根据文档,首先会分配一个值?我错过了什么吗?

3 个答案:

答案 0 :(得分:29)

在进行任何赋值之前,将评估赋值运算符右侧的所有表达式。

来自Python tutorial: First steps towards programming

  

第一行包含多个赋值:变量a和b同时获取新值0和1.在最后一行再次使用它,证明右侧的表达式全部被评估在任何分配发生之前首先。右侧表达式从左到右进行评估。

强调我的。

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

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

答案 1 :(得分:19)

Python没有像C中那样的“逗号运算符”。相反,逗号表示应该构造元组。

的右侧
a, b = a + b, a

是包含a + ba两个项目的元组。

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

答案 2 :(得分:15)

您可以考虑在副本上并行发生的分配,而不是顺序和就地。

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

a, b = b, a

无需临时变量c即可充分发挥作用。