python多个变量同时赋值
很多东西写过之后才知道自己什么都不懂。。。
本来我预料a的值是2+1也就是3,结果却是2。。。
Python自带了一个字节码工具叫dis,通过dis我们可以看到多行赋值的真相。
输出的如下
Python解释器是基于栈的虚拟机,LOAD_CONST和LOAD_FAST分别是把常量和变量入栈的操作,ROT_TWO是把栈顶两个元素翻转。赋值的时候虚拟机栈里面数据变化如下
广告:我自己业余时间也实现了一个Python虚拟机玩具,有兴趣可以了解下,欢迎加入或者提出建议 https://github.com/xupingmao/minipy
多变量赋值,写起来很方便,但是结果却出乎意料
t=1 t,a=2,t+1
本来我预料a的值是2+1也就是3,结果却是2。。。
开始以为多变量赋值还是执行多个赋值语句,看来不是这样,
然后我猜想多变量赋值等号右边是从右向左执行,测试一下:
def t1():
print 1
def t2():
print 2
def t3():
print 3
a,b,c = t1(),t2(),t3()
结果输出
1
2
3
证明是从左向右执行的(我怎么会有这么奇怪的想法,难道是受赋值语句从右向左执行的影响?)
现在看来,应该是先从左到右计算出右边的结果然后依次赋值给左边变量(我擦,这不是正常的做法么!!)。
补充
这是好久之前的文章了,只说明了Python的做法并没有说明原理,经过几年的学习,特别是对Python内部实现机制的一些了解,下面从字节码层面来分析这样实现的原理。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
广告:我自己业余时间也实现了一个Python虚拟机玩具,有兴趣可以了解下,欢迎加入或者提出建议 https://github.com/xupingmao/minipy
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
- 上一篇:没有了
- 下一篇: c++读取utf8等不同编码文件
