资讯专栏INFORMATION COLUMN

有关Python2.x版本下的dis模块的使用

zeyu / 3188人阅读

摘要:有关版本下的模块的使用事情源于昨天看书看到一个有意思的部分,就是在元组里面的元素如果存在可变的对象,比如里面的列表,类似下面这种形式那么如果我执行会发生什么,首先给我的感觉是这个会报错吧,这个是显而易见的,但是能否添加进去呢哈哈,突然觉得有

有关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中有很多奇技淫巧,整本书都在强调如何最大限度地利用Python 标准库。介绍了很多python的不常用的数据类型、操作、库等,对于入门python后想要提升对p...

    Alan 评论0 收藏0
  • Python协程(真才实学,想学进来)

    摘要:所以与多线程相比,线程的数量越多,协程性能的优势越明显。值得一提的是,在此过程中,只有一个线程在执行,因此这与多线程的概念是不一样的。 真正有知识的人的成长过程,就像麦穗的成长过程:麦穗空的时候,麦子长得很快,麦穗骄傲地高高昂起,但是,麦穗成熟饱满时,它们开始谦虚,垂下麦芒。 ——蒙田《蒙田随笔全集》 上篇论述了关于python多线程是否是鸡肋的问题,得到了一些网友的认可,当然也有...

    lykops 评论0 收藏0
  • Python Tips

    摘要:的三种数据类型字典列表元组,分别用花括号中括号小括号表示。约等于上句,可能是因为自定义变量名与内部函数或变量同名了。下,默认路径一般为。的日志模块中计时器定时器计划任务,。对象的问题怎样忽略警告不打印烦人的警告打印到终端同时记录到文件。 Python Enhancement Proposal。(PEP,Python增强建议书) Python之禅(import this) Pytho...

    Reducto 评论0 收藏0
  • python3.x安装cv2失败

    摘要:想给装一个的库,结果捣鼓半天,倒给装上了,而里则一直失败。在网上搜到有答案说要安装头文件。把该解决方法套用过来,将安装目录下我的是的文件拷贝到安装目录下的目录下我的是即可。拷贝过去,测试,成功,问题解决。 0 想给python3装一个opencv的库,结果捣鼓半天,倒给python2.x装上cv2了,而python3里import cv2则一直失败。 1 首先想到动态链接库,于是添加/...

    王笑朝 评论0 收藏0
  • css书写规范

    摘要:样式属性顺序单个样式规则下的属性在书写时,应按功能进行分组,组之间需要有一个空行。同时要以的顺序书写,提高代码的可读性。 在书写css样式的时候总是无意中就写乱了,无论是命名或者是样式的书写顺序,这里做一个总结,提醒自己在书写css的时候时刻注意,大家可以参考哈。 1. 样式属性顺序 单个样式规则下的属性在书写时,应按功能进行分组,组之间需要有一个空行。同时要以Positioning ...

    young.li 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<