如何理解python 3中的同时作业评估?

时间:2019-06-08 09:14:59

标签: python-3.x

我最近开始学习python。我今天正在同时进行作业,遇到了一些我无法理解的代码产生的结果。

x, y = 3, 5
x, y = y, (x+y)
print(y) 

输出为 8

尽管先评估了y = 8,但我不明白为什么用y = 10而不是x = y = 5。从y = 8开始,这告诉我们x = 3y = x + y被评估时?如果x = y从左到右进行评估,那怎么可能呢?

我首先调试了代码(它产生了相同的结果),我无法理解。我还尝试查看python文档,该文档指出:“分配给变量的集合中的同时重叠是从左到右发生的,有时会造成混淆。” 它提供的示例遵循我的逻辑:

x = [0, 1]
i = 0
i, x[i] = 1, 2         
print(x)

它输出 2

(从左到右评估)由于i已更新为1。因此,将使用此更新的i,因此x[1] = 2而不是x[0] = 2

我真的很感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

  

尽管先评估了y = 8,但我不明白为什么用y = 10而不是x = y = 5

首先评估作业的右侧。

在您与x = 3y = 5的分配中

x, y = y, (x+y)

首先将右侧评估为元组(5, 8),然后将其赋给左侧的值。因此y为 8

您也可以将其视为

x, y = 3, 5
temp = y, x + y
x, y = temp

要查看内部实际发生的情况,可以反汇编代码:

>>> import dis
>>> def f(x, y):
...     x, y = y, x + y
...
>>> dis.dis(f)

输出

  2           0 LOAD_FAST                1 (y)
              2 LOAD_FAST                0 (x)
              4 LOAD_FAST                1 (y)
              6 BINARY_ADD
              8 ROT_TWO
             10 STORE_FAST               0 (x)
             12 STORE_FAST               1 (y)
             14 LOAD_CONST               0 (None)
             16 RETURN_VALUE

如您所见,加法是在分配之前执行的。

答案 1 :(得分:0)

Python从右到左,从左到右。您可以想象python将其操作推送到类似堆栈的数据结构中。

查看第一个作业:x, y = 3, 5

  1. python首先将右侧值作为元组推入堆栈。

  2. 为堆栈中的 n 值运行一个拆包序列,然后将这些值从右到左放回堆栈中。 “将5推入堆栈,然后推3”。当前堆栈= [3,5]

  3. 在右侧完成后,python会在删除堆栈顶部的同时将值从左到右分配给左侧。因此,它将首先将3存入变量x,然后将5存入变量y。

您可以使用 dis 模块以字节代码检查python所做的操作。

python byte-code for assignment x, y = 3, 5

以下任务:

x, y = 3, 5
x, y = y, (x + y)

进行以下操作:

left to right assignment operations

您可以在此处检查字节码操作:http://pyspanishdoc.sourceforge.net/lib/bytecodes.html