原文作者:一蓑烟雨17815
原文链接:https://blog.csdn.net/u011320646/article/details/17843227
做题的时候为了方便,用了给多个变量同时赋值,比如t=1 t,a=2,t+1结果和自己想的并不相同,上网查询,找到了原因:
Python自带了一个字节码工具叫dis,通过dis我们可以看到多行赋值的真相。
import dis
def foo():
t=1
t,a=3,t+1
dis.dis(foo)
输出的如下
21 0 LOAD_CONST 1 (1)
2 STORE_FAST 0 (t)
22 4 LOAD_CONST 2 (3)
6 LOAD_FAST 0 (t)
8 LOAD_CONST 1 (1)
10 BINARY_ADD
12 ROT_TWO
14 STORE_FAST 0 (t)
16 STORE_FAST 1 (a)
18 LOAD_CONST 0 (None)
20 RETURN_VALUE
Python解释器是基于栈的虚拟机,LOAD_CONST和LOAD_FAST分别是把常量和变量入栈的操作,ROT_TWO是把栈顶两个元素翻转。赋值的时候虚拟机栈里面数据变化如下
# 第一步入栈
vm_stack = [..., 3, t+1] = [..., 3, 2]
# 第二步翻转
vm_stack = [..., 2, 3]
# 第三步赋值
t = vm_stack.pop() = 3
a = vm_stack.pop() = 2