
輸出結果:100
------------------------------------------------------------------------------------------------
問題是函式AA中的arg為什么會一直保存函式A中的arg的?什么道理??
uj5u.com熱心網友回復:
def A(arg):
def AA():
print('arg--',arg)
return AA
print('AA--',AA)
a=A(100)
print(a())
顯示的結果是在回圈內的arg,retrun AA 后的print都沒有執行
uj5u.com熱心網友回復:
-------------------------------------------------------------------------------
retrun AA 后的print當然沒有執行了,因為a所參考的AA()函式print('arg--',arg)后,已經回傳了。
uj5u.com熱心網友回復:
所以說,arg并沒有被保留uj5u.com熱心網友回復:
樓上,你沒理解我的意思,按理說函式A被呼叫時將引數arg壓入堆疊,回傳時arg出堆疊銷毀。但使用a呼叫區域函式AA時,arg依然有值100,我就想知道這個100是怎么來的。arg為什么沒隨第一次函式呼叫結束而被銷毀。uj5u.com熱心網友回復:
下面是函式在底層中的運行步驟def A(arg): # 第二步 arg=100第八步效果圖
def AA(): # 第三步 看了一眼就走了,這是函式的定義不執行 #第七步 確認函式a指向記憶體地址函式AA
print(arg) #第八步 執行陳述句,輸出結果
# print(id(AA),AA)
return AA #第四步 回傳了一個函式AA記憶體地址
a=A(100) #第一步 呼叫A函式,傳遞引數100 #第五步 a指向函式AA的記憶體地址,即a也是一個函式
# print(id(a),a)
a() # 第六步 呼叫函式a #第九步 a函式呼叫完成,和執行第五步的功能一樣,主要是對函式的回傳值做結果

區域函式AA是函式的A的函式體,執行第二步的時候,變數arg指向了100,到第四步return 后,A函式結束了,但它的函式體內成員還在,即變數a,函式AA還在,編譯型語言可能有函式銷毀函式體也銷毀的,python是解釋型語言,就像下面這樣,所有arg還在,
arg=100變數a和變數AA都指向同一個記憶體地址,加了兩個print方便觀察,都指向同一個記憶體地址。
def AA()
print(arg)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/43382.html
