繁体   English   中英

当我在 try-except 块中使用该变量时,我在赋值之前引用了局部变量

[英]i am getting local variable referenced before assignment when i use that variable in try-except block

我正进入(状态

local variable 'flag' referenced before assignment

在 python 中。 我在这里做错了什么?

flag = 0
def abc():
    while flag <= 10:
        try:
            print(10/0)
        except Exception:
            print('yo')
            flag += 1

abc()
flag = 0
def abc(argument):
    while argument <= 10:
        try:
            print(10/0)
        except Exception:
            print('yo')
            argument += 1

abc(flag)
def abc():
    flag = 0
    while flag <= 10:
        try:
            print(10/0)
        except Exception:
            print('yo')
            flag += 1
    return flag

abc()

我会用这个。

这不是在 try/catch 中引用该变量的问题,而是在您使用它的 function 之外定义该变量的问题。 flagabc()之外声明并且未声明为全局; 因此,python 不相信 function 中有一个名为flag的变量可以使用。 (如果我是正确的, flag被声明为__main__的一部分,因为您可以在对abc()的调用下方打印它而不会出现问题。)

如果您打算将flag作计数器,则将其移动到def中可以:

def abc():
    flag = 0
    while flag <= 10:
        try:
            print(10/0)
        except Exception:
            print('yo')
            flag += 1

abc()

但是,如果您打算在其他地方使用它,则必须将其声明为全局(推荐)或将其声明为局部变量然后返回。 如果它是在外部定义的,请考虑将其作为参数传递给abc

您是 Python 中变量作用域的受害者。 您需要的是global关键字(关于该主题的精彩教程)。 在这种情况下:

flag = 0

def abc():
    global flag
    while flag <= 10:
        try:
            print(10/0)
        except Exception:
            print('yo')
            flag += 1

abc()

请注意abc定义开头的新global flag行。 这告诉 function 关键字flag应该来自全局 scope,而不是本地 scope。

作为旁注,使用全局变量通常被认为是不好的做法,所以我建议您考虑一下您的整体设计。 肯定有使用global的有效时间,但是,尽可能避免使用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM