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 yspam 。 也就是说

 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 

在“评估命令”一节的文档中对此进行了解释:

…在评估任务时,在左侧之前评估右侧。

第一个表达式:

  1. 创建一个值为y,x+y的临时元组
  2. 分配给另一个临时元组
  3. 将元组提取到变量xy

第二个语句实际上是两个表达式,没有元组的用法。

令人惊讶的是,第一个表达其实是:

 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是同时赋值的。

    Interesting Posts