flag1 = True
flag2 = True
def test(x):
if x % 2 ==0 :
flag1 = True
if x >=10:
flag2 = True
return flag1 and flag2
print(test(9))
该问题说要检查一个大于10的偶数。但是执行代码后,会弹出以下错误: UnboundLocalError:分配前引用了本地变量'flag2'。
我来自C ++,并且刚开始学习python。如果可能,请提供一些解决方案。
编辑:谢谢大家提供的惊人答案。我能够纠正我的错误。
答案 0 :(得分:2)
这仅仅是因为flag1
和flag2
仅在程序进入if
块时才被初始化/分配。如果if
从未通过怎么办。这样return
就找不到flag1
和/或flag2
。
因此-
def test(x):
flag1, flag2 = False, False #This statement is possible in python (because you are from C++)
if x % 2 ==0 :
flag1 = True
if x >=10:
flag2 = True
return flag1 and flag2
答案 1 :(得分:2)
您可以像这样使用全局语句
flag1 = False
flag2 = False
def test(x):
global flag1
global flag2
if x % 2 ==0 :
flag1 = True
if x >= 10:
flag2 = True
return flag2 and flag2
print(test(9))
或在函数内部定义标志变量,建议在调用测试函数一次后使用,如果将标志变量的值更改为True,则测试函数将在连续调用后显示异常,因此您需要实例变量标志,这些标志将在函数内部定义。
def test(x):
flag1 = False
flag2 = False
if x % 2 ==0 :
flag1 = True
if x >= 10:
flag2 = True
return flag1 and flag2
print(test(9))
奖金:用于了解UnboundLocalError和作用域的链接 https://eli.thegreenplace.net/2011/05/15/understanding-unboundlocalerror-in-python
答案 2 :(得分:0)
这应该有效:
def test(x):
flag1 = False
flag2 = False
if x % 2 ==0 :
flag1 = True
if x >=10:
flag2 = True
return flag1 and flag2
print(test(9))
答案 3 :(得分:0)
Python中的名称空间/作用域规则与C ++完全不同。与线
flag1 = True
flag2 = True
您显然正在尝试初始化两个变量(如C ++),但为此
要在这里工作,必须将它们移入函数中。另外,这些应初始化为False
(否则,它们只能设置为True
...):
def test(x):
flag1 = False
flag2 = False
if x % 2 ==0 :
flag1 = True
if x >=10:
flag2 = True
return flag1 and flag2
现在,为什么不可以在函数外部初始化变量吗?在Python中,函数可以全局访问 all 变量,而无需使用global
关键字,但至关重要的是,只能全局访问 read 。也就是说,可以从flag1
函数内部读取在模块级别(函数外部)定义的flag2
和test
的值。但是,在编译test
时(运行程序并在解析器点击“ def
行时自动发生),编译器会看到将值写入flag1
和{{ 1}}在flag2
内,因此得出结论,这些都是 local 变量,这意味着将在函数内部完全忽略全局test
和flag1
。反过来,这意味着仅在flag2
为flag1
时才定义名称flag2
和if
(因此,对于大于等于10的偶数,该函数将运行,但是否则将会崩溃)。
我提供的解决方案是使True
和flag1
成为局部变量。您还可以通过将它们保留在函数外部,并向flag2
函数指定允许它们同时读取和写入到全局{{1 }}和test
使用flag1
关键字,如其他答案所示。如您所知,通常不建议这样做。
答案 4 :(得分:-1)
由于未在函数内部声明flag1和flag2,因此如果第二个条件为False,则将永远不会在函数中创建flag2。这就是为什么会出现错误。
您可以在函数内部将flag1和flag2设置为全局
flag1 = True
flag2 = True
def test(x):
global flag1, flag2
if x % 2 ==0 :
flag1 = True
if x >=10:
flag2 = True
return flag1 and flag2
print(test(9))
答案 5 :(得分:-3)
对于Python2:
test = lambda x: 1 - x & 1 * x / 10