Python中的多重赋值及其评估顺序
假设我们有:
>>> 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
第一个表达式:
- 创建了一个临时的元组,里面的值是
y,x+y
- 把这个元组赋值给另一个临时的元组
- 从这个元组中提取出变量
x
和y
第二个语句其实包含了两个表达式,没有使用元组。
让人惊讶的是,第一个表达式实际上是:
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
(此时 x
和 y
是一样的)加上 y
,所以这等同于
x = y
y = y + y