[英]Why the traceback error with a try/except recursive(?) 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.