最近我开始好奇以下伪 python 代码的第 2 行发生了什么:
def my_fun(foo,bar):
foo
return foo + bar
我开始感兴趣的原因是我正在尝试 Light Table 并尝试在“foo”上放置一个手表。它似乎导致 python 解释器挂起。
我是否正确地认为这条线完全没有影响并且不会导致任何错误?有人可以解释一下口译员在这里到底做了什么吗?
通过内置的一点帮助,人们可以查看正在发生的事情dis http://docs.python.org/2/library/dis.html module:
import dis
def my_fun(foo,bar):
foo
return foo + bar
dis.dis(my_fun)
The dis.dis
function 反汇编函数(是的,它可以反汇编自身)、方法和类。
的输出dis.dis(my_fun)
is:
4 0 LOAD_FAST 0 (foo)
3 POP_TOP
5 4 LOAD_FAST 0 (foo)
7 LOAD_FAST 1 (bar)
10 BINARY_ADD
11 RETURN_VALUE
前两个字节码正是我们所需要的:foo
line.
这些字节码的作用如下:
- 第一个推送对局部变量的引用
foo
到堆栈上
(加载_快速 http://docs.python.org/2/library/dis.html#opcode-LOAD_FAST)
- 第二个删除堆栈顶部(POP_TOP http://docs.python.org/2/library/dis.html#opcode-POP_TOP)
基本上,foo
线没有影响。 (好吧,如果foo
那么变量没有定义LOAD_FAST
会抛出NameError
)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)