繁体   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