博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python多个变量同时赋值
阅读量:4294 次
发布时间:2019-05-27

本文共 1264 字,大约阅读时间需要 4 分钟。

 
很多东西写过之后才知道自己什么都不懂。。。

多变量赋值,写起来很方便,但是结果却出乎意料

t=1t,a=2,t+1
本来我预料a的值是2+1也就是3,结果却是2。。。

开始以为多变量赋值还是执行多个赋值语句,看来不是这样,

然后我猜想多变量赋值等号右边是从右向左执行,测试一下:

def t1():    print 1def t2():    print 2def t3():    print 3a,b,c = t1(),t2(),t3()

结果输出

1

2

3

证明是从左向右执行的(我怎么会有这么奇怪的想法,难道是受赋值语句从右向左执行的影响?)

现在看来,应该是先从左到右计算出右边的结果然后依次赋值给左边变量(我擦,这不是正常的做法么!!)。

补充

这是好久之前的文章了,只说明了Python的做法并没有说明原理,经过几年的学习,特别是对Python内部实现机制的一些了解,下面从字节码层面来分析这样实现的原理。
Python自带了一个字节码工具叫dis,通过dis我们可以看到多行赋值的真相。
import disdef 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() = 3a = vm_stack.pop() = 2
广告:我自己业余时间也实现了一个Python虚拟机玩具,有兴趣可以了解下,欢迎加入或者提出建议 
https://github.com/xupingmao/minipy

转载地址:http://btuws.baihongyu.com/

你可能感兴趣的文章
3、JavaWeb学习之基础篇—JSP
查看>>
4、JavaWeb学习之基础篇—Session
查看>>
5、JavaWeb学习之基础篇—标签(自定义&JSTL)
查看>>
8、JavaWEB学习之基础篇—文件上传&下载
查看>>
reRender属性的使用
查看>>
href="javascript:void(0)"
查看>>
h:panelGrid、h:panelGroup标签学习
查看>>
f:facet标签 的用法
查看>>
<h:panelgroup>相当于span元素
查看>>
java中append()的方法
查看>>
必学高级SQL语句
查看>>
经典SQL语句大全
查看>>
Eclipse快捷键 10个最有用的快捷键
查看>>
log日志记录是什么
查看>>
<rich:modelPanel>标签的使用
查看>>
<h:commandLink>和<h:inputLink>的区别
查看>>
<a4j:keeyAlive>的英文介绍
查看>>
关于list对象的转化问题
查看>>
VOPO对象介绍
查看>>
jqpl语法一
查看>>