在代码对象的co_consts属性中没有做什么?

usu*_* me 7 python python-2.7 python-internals

以下函数返回None:

In [5]: def f():
   ...:     pass
Run Code Online (Sandbox Code Playgroud)

所以我对这个输出并不感到惊讶:

In [8]: dis.dis(f)
  2           0 LOAD_CONST               0 (None)
              3 RETURN_VALUE        

In [10]: f.__code__.co_consts
Out[10]: (None,)
Run Code Online (Sandbox Code Playgroud)

好的,这是有道理的.但是现在,考虑以下功能:

In [11]: def g():
   ....:     return 1

In [12]: dis.dis(g)
  2           0 LOAD_CONST               1 (1)
              3 RETURN_VALUE        

In [13]: g.__code__.co_consts
Out[13]: (None, 1)
Run Code Online (Sandbox Code Playgroud)

g不使用None,为什么会这样co_consts

Mar*_*ers 8

函数的默认返回值是None,因此始终插入.如果你总是要达到一个return语句,Python不想分析.

考虑例如:

def foo():
    if True == False:
        return 1
Run Code Online (Sandbox Code Playgroud)

上面的函数将返回None,但只是因为该if语句永远不会出现True.

在您的简单情况下,对我们人类来说很明显只有一个RETURN_VALUE操作码,但是将其扩展到计算机检测的一般情况并不值得.更好的只是存储None参考并完成它,一个参考是非常便宜的.