什么是无在代码对象的co_consts属性中做什么?

时间:2014-12-27 13:33:26

标签: python python-2.7 python-internals

以下函数返回None

In [5]: def f():
   ...:     pass

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

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

In [10]: f.__code__.co_consts
Out[10]: (None,)

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

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)

g不使用None,为什么它在co_consts

1 个答案:

答案 0 :(得分:8)

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

考虑例如:

def foo():
    if True == False:
        return 1

上述函数将返回None,但仅仅因为if语句永远不会是True

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