Python 字节码 + LOAD_NAME 按值还是按名称?

问题描述

我是高中的法语 CS 老师。我们正在研究字节码在 Python 虚拟机上的执行。我们最终提出了一个幼稚的问题:在执行 LOAD_NAME 0(字节码地址 8 处的命令)后,堆栈顶部是什么,符号 x ?还是 x 指向的值? (此处为 238)。

接下来是反汇编的字节码

CONSTS (238,1512,None)
NAMES ('x','y','m')
VARNAMES ()
  1           0 LOAD_CONST               0 (238)
              2 STORE_NAME               0 (x)
              4 LOAD_CONST               1 (1512)
              6 STORE_NAME               1 (y)
              8 LOAD_NAME                0 (x)
             10 LOAD_NAME                1 (y)
             12 COMPARE_OP               4 (>)
             14 POP_JUMP_IF_FALSE       20
             16 LOAD_NAME                0 (x)
             18 JUMP_FORWARD             2 (to 22)
        >>   20 LOAD_NAME                1 (y)
        >>   22 STORE_NAME               2 (m)
             24 LOAD_CONST               2 (None)
             26 RETURN_VALUE

获得

import dis

prog = compile('x=238;y=1512;m=x if (x>y) else y;','<string>','exec')
print(f"CONSTS {prog.co_consts}")
print(f"NAMES {prog.co_names}")
print(f"VARNAMES {prog.co_varnames}")
dis.dis(prog)

我猜 inspect 模块允许跟踪 TOS,但我还没有花时间浏览它的文档,所以如果有人可以分享知识我们很感兴趣。提前谢谢

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)