我最近开始学习python。我今天正在同时进行作业,遇到了一些我无法理解的代码产生的结果。
x, y = 3, 5
x, y = y, (x+y)
print(y)
输出为 8 。
尽管先评估了y = 8
,但我不明白为什么用y = 10
而不是x = y = 5
。从y = 8
开始,这告诉我们x = 3
在y = 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
。
我真的很感谢您的帮助。
答案 0 :(得分:3)
尽管先评估了
y = 8
,但我不明白为什么用y = 10
而不是x = y = 5
首先评估作业的右侧。
在您与x = 3
和y = 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
python首先将右侧值作为元组推入堆栈。
为堆栈中的 n 值运行一个拆包序列,然后将这些值从右到左放回堆栈中。 “将5推入堆栈,然后推3”。当前堆栈= [3,5]
在右侧完成后,python会在删除堆栈顶部的同时将值从左到右分配给左侧。因此,它将首先将3存入变量x,然后将5存入变量y。
您可以使用 dis 模块以字节代码检查python所做的操作。
以下任务:
x, y = 3, 5
x, y = y, (x + y)
进行以下操作:
您可以在此处检查字节码操作:http://pyspanishdoc.sourceforge.net/lib/bytecodes.html