簡體   English   中英

遞歸的“try except”塊中的變量減速 function

[英]Variable decleration in a 'try except' block of a recursive function

試圖在遞歸的第一次迭代中聲明變量 t

class c:
    def __init__(self, a):
        self.n=a
def a():
    t=c(5)
    def b():
        print(t.n)
    b()

打印 t

def d():
    try:
        t
        print(t.n)
    except:
        t=c(5)
        d()

不要打印 t

我不明白其中的區別以及為什么第一個 function 有效而第二個無效

它不會打印t因為t是每個 function 調用的局部變量,並且在對d的其他調用的上下文中無法識別。 如果你想使用它,你要么將它設為全局,要么將它作為參數傳遞

def d(t=None):
    try:
        print(t.n)
    except:
        t=c(5)
        d(t=t)
d()

更多解釋

(mCoding 有一個很棒的視頻推薦你看,頻道的內容很不錯)

為什么它在d而不是b本地?

發生的事情是:在編譯時 python 將查看您的 function 並查看是否在您的t中的任何地方定義? 如果是(對於d的情況,即使變量是在使用后分配的),它將從 scope 中獲取值,如果不是,它將嘗試在下一個 scope 中找到它,依此類推。 如果找不到它,它將假定它是全局的。

例如:

variable = 1
def method_1():
    print(variable)
    variable = 2
method_1()

即使在全局 scope 中定義了變量,也會拋出錯誤,因為編譯器發現我們在 function 中分配變量

另一方面:

variable = 1
def method_2()
    print(variable)

method_2()

會工作,因為編譯器認為變量是全局的

在第二段代碼中,當由於未定義t而發生異常時,它會移動到 except 塊,而 except 塊會做什么? 它創建了一個名為t的變量,但它是堆棧上 function 調用的局部變量,然后再次調用 function 執行相同的操作,因為當您再次調用 function 時,新的 memory 被分配給 function 調用堆棧和t未在該 function 調用中定義。 因此,它拋出一個異常並再次做同樣的事情。

在此處輸入圖像描述

正如您在圖片中看到的那樣,會進行無限次 function 調用,直到發生堆棧溢出錯誤,這會導致正在運行的程序終止,因為它永遠不會跳出 try-except 塊,因為每次都會調用 function t在本地定義到 function 調用並進行另一個調用,它沒有在它的t中定義。

暫無
暫無

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

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