[英]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.