def add(a):
a = a 1
print(a)
if a < 10:
add(a)
print(a)
add(1)

我不明白為什么a即使沒有 else 陳述句,它的值應該在 10 停止時在 10 之后開始減少。誰能解釋原因?
uj5u.com熱心網友回復:
print() 除錯
def add(a):
a = a 1
print(f"#1, a: {a}, id: {id(a)}")
if a < 10:
print("recursion")
add(a)
print(f"#2, a: {a}, id: {id(a)}")
add(1)
# stdout:
#1, a: 2, id: 9801280
recursion
#1, a: 3, id: 9801312
recursion
#1, a: 4, id: 9801344
recursion
#1, a: 5, id: 9801376
recursion
#1, a: 6, id: 9801408
recursion
#1, a: 7, id: 9801440
recursion
#1, a: 8, id: 9801472
recursion
#1, a: 9, id: 9801504
recursion
#1, a: 10, id: 9801536
#2, a: 10, id: 9801536
#2, a: 9, id: 9801504
#2, a: 8, id: 9801472
#2, a: 7, id: 9801440
#2, a: 6, id: 9801408
#2, a: 5, id: 9801376
#2, a: 4, id: 9801344
#2, a: 3, id: 9801312
#2, a: 2, id: 9801280
拆卸
您的版本的位元組碼add()不顯示任何BINARY_SUBTRACT操作:
import dis
dis.dis(add)
2 0 LOAD_FAST 0 (a)
2 LOAD_CONST 1 (1)
4 BINARY_ADD
6 STORE_FAST 0 (a)
3 8 LOAD_GLOBAL 0 (print)
10 LOAD_FAST 0 (a)
12 CALL_FUNCTION 1
14 POP_TOP
4 16 LOAD_FAST 0 (a)
18 LOAD_CONST 2 (10)
20 COMPARE_OP 0 (<)
22 POP_JUMP_IF_FALSE 32
5 24 LOAD_GLOBAL 1 (add)
26 LOAD_FAST 0 (a)
28 CALL_FUNCTION 1
30 POP_TOP
6 >> 32 LOAD_GLOBAL 0 (print)
34 LOAD_FAST 0 (a)
36 CALL_FUNCTION 1
38 POP_TOP
40 LOAD_CONST 0 (None)
42 RETURN_VALUE
解釋
該
if陳述句遞回執行add(),直到函式的最后一行之前,然后繼續“等待”。所有這些等待“堆疊”的指令行最終將按LIFO順序執行,因為最近的呼叫是由舊的呼叫呼叫并解決的。
最終結果是
a沒有被遞減,而是使用來自每個“等待”指令行的舊值進行評估。
額外的
這種遞回可用于將金字塔狀(雙頂)模式寫入標準輸出:
def paint_pyramid(a):
a = a 1
print(a*'*')
if a < 5:
paint_pyramid(a)
print(a*'*')
paint_pyramid(0)
# stdout:
*
**
***
****
*****
*****
****
***
**
*
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/507851.html
上一篇:如何通過父級中不存在的屬性過濾樹
下一篇:如何迭代序言中的空輸入?
