如果你在python中单独写一个变量名怎么办?

foo*_*cue 17 python lighttable

最近我对以下伪造的python代码的第2行发生了什么感到好奇:

def my_fun(foo,bar):
    foo
    return foo + bar
Run Code Online (Sandbox Code Playgroud)

我之所以感兴趣的原因是我正在尝试使用Light Table并尝试将手表放在"foo"上.它似乎导致python解释器挂起.

我是否认为这条线完全没有效果并且不会导致任何错误?有人可以解释一下翻译在这里做了什么吗?

Nig*_*nel 27

在内置的dis模块的帮助下,可以看看发生了什么:

import dis

def my_fun(foo,bar):
    foo
    return foo + bar

dis.dis(my_fun)
Run Code Online (Sandbox Code Playgroud)

dis.dis函数反汇编函数(是的,它可以自行解组),方法和类.

输出dis.dis(my_fun)是:

  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
Run Code Online (Sandbox Code Playgroud)

前两个字节码正是我们所需要的:foo线路.

这是这些字节码的作用:

  1. 第一个将对局部变量的引用推foo送到堆栈(LOAD_FAST)
  2. 第二个删除堆栈顶部(POP_TOP)

基本上,foo行没有效果.(好吧,如果foo没有定义变量那么LOAD_FAST就会抛出NameError)


Jak*_*yer 9

什么都没发生.它等同于无意义的操作查看dis输出

In [3]: dis.dis(my_fun)
  2           0 LOAD_FAST                0 (foo)
              3 POP_TOP             

  3           4 LOAD_FAST                0 (foo)
              7 LOAD_FAST                1 (bar)
             10 BINARY_ADD          
             11 RETURN_VALUE 
Run Code Online (Sandbox Code Playgroud)

我们可以看到它快速加载,foo然后对它没有任何作用.