簡體   English   中英

在 Python 字節碼中,如果 function 什么都不返回,為什么 CALL_FUNCTION 指令后面還有 POP_TOP 指令?

[英]In Python bytecode, why is there a POP_TOP instruction after the CALL_FUNCTION instruction if the function returns nothing?

我在研究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 行

function 在 Python 中沒有“不返回任何內容”之類的東西。 即使 function 沒有顯式return值,function 也會隱式返回None (如果您dis.dis(func)您將在生成的字節碼中看到它)。

如果它不這樣做,字節碼編譯器將需要更復雜,因為它需要一些方法來區分有和沒有返回值的函數(因為函數首先是 class 對象並且可以重新分配,你可以'甚至不使用編譯時規則來執行此操作;它必須在運行時逐個調用地處理); 照原樣,它可以無條件地將它們視為具有返回值,只是某些返回值(隱式None )沒有其他值有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM