Python中的多重赋值和评估顺序
以下Python表达式有什么区别:
# First: x,y = y,x+y # Second: x = y y = x+y
首先给出不同的结果比秒 。
例如,
第一:
>>> 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
y是第一个是3, 第二个是4
在赋值语句中,在进行变量的实际设置之前,总是对右手边进行充分评估。 所以,
x, y = y, x + y
评估y
(我们称之为结果ham
),评估x + y
(称为spam
), 然后将x
设为ham
and y
为spam
。 也就是说
ham = y spam = x + y x = ham y = spam
相比之下,
x = y y = x + y
将x
设置为y
,然后将y
设置为x
(其中== y
)加上y
,所以相当于
x = y y = y + y
在“评估命令”一节的文档中对此进行了解释:
…在评估任务时,在左侧之前评估右侧。
第一个表达式:
- 创建一个值为
y,x+y
的临时元组 - 分配给另一个临时元组
- 将元组提取到变量
x
和y
第二个语句实际上是两个表达式,没有元组的用法。
令人惊讶的是,第一个表达其实是:
temp=x x=y y=temp+y
你可以在“ 括号表单 ”中了解更多关于逗号的用法。
在第二种情况下,您将x+y
分配给x
在第一种情况下,第二个结果( x+y
)被分配给y
这就是为什么你获得不同的结果。
在你编辑之后
这是因为在声明中
x,y = y,x+y
评估右侧成员的所有变量,然后存储在左侧成员中。 因此, 先与正确的成员进行,然后与左边的成员进行。
在第二个声明
x = y y = x + y
哟首先评估y
并将其分配给x
; 这样, x+y
的总和相当于y+y
的总和,而不是x+x
的总和,这是第一种情况。
第一个是类似tuple的任务:
x,y = y,x+y
其中x
是元组的第一个元素, y
是第二个元素,所以你在做什么:
x = y y = x+y
第二个是做一个直接分配:
x=y x=x+y
a, b = 0, 1 while b < 10: print(b) a, b = b, a+b
产量
1 1 2 3 5 8
变量a和b同时得到新值0和1,同样的a,b = b,a + b,a和b是同时赋值的。