求助,执行字节码指令时栈的具体变化是怎么样的?

2022-05-21 10:27:31 +08:00
 codists

一、问题描述

1.1 源码

import dis
print(dis.dis('s[a] += b'))

输出:

  1           0 LOAD_NAME                0 (s)
              2 LOAD_NAME                1 (a)
              4 DUP_TOP_TWO
              6 BINARY_SUBSCR
              8 LOAD_NAME                2 (b)
             10 INPLACE_ADD
             12 ROT_THREE
             14 STORE_SUBSCR
             16 LOAD_CONST               0 (None)
             18 RETURN_VALUE
None

1.2 问题

以上代码来自于《 Fluent Python 2 》 p55-p56 ,我自己按照字节码指令的顺序绘制栈的变化,得不到代码执行的结果,请各位大佬帮忙看下问题出在哪里。

二、问题分析

https://github.com/codists/learnings/blob/main/python/images/temp.jpg 以上是我按照字节码命令绘制的栈变化,但是最后得到的结果是s[a]+b=s[a]+b

请问各位大佬,是我的绘制过程有问题(如:某一个操作其实没有入栈,或者某一个操作应该有出栈)还是说我理解有问题(如:其实字节码指令描述的并不是连续的过程)?麻烦各位大佬解答的时候最好能提供一下参考资料,谢谢啦。

2308 次点击
所在节点    Python
4 条回复
sikariba
2022-05-21 11:25:16 +08:00
我自己画出来的也不对,不过能确定你地址 6 、10 的地方画错了,6 的那里要出栈两个再写入( Binary operations remove the top of the stack (TOS) and the second top-most stack item (TOS1) from the stack. They perform the operation, and put the result back on the stack.),10 是 inplace 的操作,你 append 了。咱俩可以讨论一下
sikariba
2022-05-21 11:44:38 +08:00
10 的那里再出一次栈就可以画出来了
chenxytw
2022-05-21 11:46:10 +08:00
6, 10 画错了。
两个都是要先出栈两次。只是 10 的 TOS1 如果支持 inplace ,等同于出栈一次。
codists
2022-05-21 15:29:28 +08:00
@sikariba
@chenxytw
感谢两位大佬的解答,6 、10 这两步出栈确实是关键点,是我以前没理解到位。Thx for your enlighten answers again 。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/854310

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX