首页 > 解决方案 > 在 Python 字节码中,如果函数什么都不返回,为什么 CALL_FUNCTION 指令后面还有 POP_TOP 指令?

问题描述

我正在研究Python字节码,发现POP_TOP指令后面还有一条CALL_FUNCTION指令。在这里做什么POP_TOP

a = 1
b = 2
c = a + b
print(c)
def func(e, f, g):
    h = e + f + g

func(a, b, c)

跑步后python3 -m dis main.py,我得到了

  1           0 LOAD_CONST               0 (1)
              2 STORE_NAME               0 (a)

  2           4 LOAD_CONST               1 (2)
              6 STORE_NAME               1 (b)

  3           8 LOAD_NAME                0 (a)
             10 LOAD_NAME                1 (b)
             12 BINARY_ADD
             14 STORE_NAME               2 (c)

  4          16 LOAD_NAME                3 (print)
             18 LOAD_NAME                2 (c)
             20 CALL_FUNCTION            1
             22 POP_TOP

  5          24 LOAD_CONST               2 (<code object func at 0x7fb9aebb59c0, file "btins3.py", line 5>)
             26 LOAD_CONST               3 ('func')
             28 MAKE_FUNCTION            0
             30 STORE_NAME               4 (func)

  8          32 LOAD_NAME                4 (func)
             34 LOAD_NAME                0 (a)
             36 LOAD_NAME                1 (b)
             38 LOAD_NAME                2 (c)
             40 CALL_FUNCTION            3
             42 POP_TOP
             44 LOAD_CONST               4 (None)
             46 RETURN_VALUE

请参阅第 22行和第 42 行

标签: pythonreturn-valuebytecode

解决方案


在 Python 中没有“不返回任何内容”的函数。即使一个函数没有明确return的值,该函数也会隐式返回None(如果您dis.dis(func)会在生成的字节码中看到它)。

如果它不这样做,字节码编译器将需要更复杂,因为它需要一些方法来区分有和没有返回值的函数(并且由于函数是第一类对象并且可以重新分配,你可以'甚至不使用编译时规则来执行此操作;它必须在运行时逐个调用地处理);照原样,它可以无条件地将它们视为具有返回值,只是某些返回值(隐式None)不如其他返回值有用。


推荐阅读