摘要:有关版本下的模块的使用事情源于昨天看书看到一个有意思的部分,就是在元组里面的元素如果存在可变的对象,比如里面的列表,类似下面这种形式那么如果我执行会发生什么,首先给我的感觉是这个会报错吧,这个是显而易见的,但是能否添加进去呢哈哈,突然觉得有
有关Python2.x版本下的dis模块的使用
事情源于昨天看书看到一个有意思的部分,就是在Python元组里面的元素如果存在可变的对象,比如Python里面的列表,类似下面这种形式:
t = (1, 2, [3, 4])
那么如果我执行t[2] += [5, 6]会发生什么,首先给我的感觉是这个会报错吧,这个是显而易见的,但是5能否添加进去呢?哈哈,突然觉得有点意思了,然后答案就是:
t变成(1, 2, [3, 4, 5, 6]) 因为tuple不支持对它的赋值,所以会抛出TypeError异常
具体的报错信息可以在交互式环境中自行测试一下
这个时候我们可以使用Python的dis模块来反编译一下,看看操作的字节码,如下所示:
In [14]: dis.dis(compile("t[2]+=[5, 6]", " ", "single")) 1 0 LOAD_NAME 0 (t) 3 LOAD_CONST 0 (2) 6 DUP_TOPX 2 9 BINARY_SUBSCR 10 LOAD_CONST 1 (5) 13 LOAD_CONST 2 (6) 16 BUILD_LIST 2 19 INPLACE_ADD 20 ROT_THREE 21 STORE_SUBSCR 22 LOAD_CONST 3 (None) 25 RETURN_VALUE
因为我使用的是Python2的版本,所以在使用dis.dis的时候,我们需要先将代码编译一下,即使用compile方法,这里需要注意的是第三个参数,第三个参数有三个选项,"single"、"eval"、"exec",具体的可以help查看一下,下面我们来说一下上面字节码的关键行的解释:
BINARY_SUBSCR 表示将t[2]存入栈顶TOS INPLACE_ADD 表示计算 TOS+[5, 6],这一步是可以完成的,因为TOS指向的是一个可变对象,也就是[3, 4]这个列表 STORE_SUBSCR 这一步失败,这是因为t是一个元组,是不可变的,对其元素进行赋值是不被允许的
所以我的建议是:
不要把可变对象放入元组里面
增量赋值不是一个原子操作,像上面的那样,虽然抛出错误,但是还是完成了操作
了解Python代码背后的运行机制很有帮助
不建议这样,虽然我们可以使用t[2].extend([5, 6])来完成操作,但是我们仍然不建议这样做,不要将可变对象放入元组中。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/41339.html
摘要:所以与多线程相比,线程的数量越多,协程性能的优势越明显。值得一提的是,在此过程中,只有一个线程在执行,因此这与多线程的概念是不一样的。 真正有知识的人的成长过程,就像麦穗的成长过程:麦穗空的时候,麦子长得很快,麦穗骄傲地高高昂起,但是,麦穗成熟饱满时,它们开始谦虚,垂下麦芒。 ——蒙田《蒙田随笔全集》 上篇论述了关于python多线程是否是鸡肋的问题,得到了一些网友的认可,当然也有...
摘要:的三种数据类型字典列表元组,分别用花括号中括号小括号表示。约等于上句,可能是因为自定义变量名与内部函数或变量同名了。下,默认路径一般为。的日志模块中计时器定时器计划任务,。对象的问题怎样忽略警告不打印烦人的警告打印到终端同时记录到文件。 Python Enhancement Proposal。(PEP,Python增强建议书) Python之禅(import this) Pytho...
摘要:想给装一个的库,结果捣鼓半天,倒给装上了,而里则一直失败。在网上搜到有答案说要安装头文件。把该解决方法套用过来,将安装目录下我的是的文件拷贝到安装目录下的目录下我的是即可。拷贝过去,测试,成功,问题解决。 0 想给python3装一个opencv的库,结果捣鼓半天,倒给python2.x装上cv2了,而python3里import cv2则一直失败。 1 首先想到动态链接库,于是添加/...
阅读 1207·2023-04-26 01:38
阅读 1430·2021-11-15 11:39
阅读 3234·2021-09-22 15:43
阅读 2584·2019-08-30 15:55
阅读 2017·2019-08-30 14:17
阅读 2831·2019-08-29 14:16
阅读 3037·2019-08-26 18:36
阅读 2590·2019-08-26 12:19