Python中的多重赋值及其评估顺序

75 投票
11 回答
55715 浏览
提问于 2025-04-17 09:31

假设我们有:

>>> x = 1
>>> y = 2

如果我们尝试像这样同时给两个值赋值:

>>> x, y = y, x+y
>>> x
2
>>> y
3

那么我们得到的结果就和分别赋值时不一样:

>>> x = 1
>>> y = 2
>>> x = y
>>> y = x+y
>>> x
2
>>> y
4

这是为什么呢?


可以参考 多个赋值的语义,了解括号在多个赋值左侧的作用和目的。

还可以查看 理解Python的交换:为什么 a, b = b, a 并不总是等同于 b, a = a, b?,了解更复杂的情况,其中赋值的顺序很重要。

11 个回答

8

第一个表达式:

  1. 创建了一个临时的元组,里面的值是 y,x+y
  2. 把这个元组赋值给另一个临时的元组
  3. 从这个元组中提取出变量 xy

第二个语句其实包含了两个表达式,没有使用元组。

让人惊讶的是,第一个表达式实际上是:

temp=x
x=y
y=temp+y

你可以在 "带括号的形式" 中了解更多关于逗号的用法。

19

在文档中,有一部分叫做 “求值顺序”,里面解释了:

... 在进行赋值的时候,右边的内容会先被计算,然后才是左边的内容。

116

在赋值语句中,右边的内容总是会在实际给变量赋值之前被完全计算出来。所以,

x, y = y, x + y

会先计算 y(我们称这个结果为 ham),然后计算 x + y(我们称这个结果为 spam),然后x 设置为 ham,把 y 设置为 spam。也就是说,这就像是

ham = y
spam = x + y
x = ham
y = spam

相比之下,

x = y
y = x + y

会先把 x 设置为 y,然后再把 y 设置为 x(此时 xy 是一样的)加上 y,所以这等同于

x = y
y = y + y

撰写回答