![](/img/trans.png)
[英]Can someone explain CALL_FUNCTION and RETURN_VALUE from python bytecode
[英]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.