此Python程序有可能的解决方案吗?

时间:2018-09-24 18:32:52

标签: python-3.x

 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。如果可能,请提供一些解决方案。

编辑:谢谢大家提供的惊人答案。我能够纠正我的错误。

6 个答案:

答案 0 :(得分:2)

这仅仅是因为flag1flag2仅在程序进入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函数内部读取在模块级别(函数外部)定义的flag2test的值。但是,在编译test时(运行程序并在解析器点击“ def行时自动发生),编译器会看到将值写入flag1和{{ 1}}在flag2内,因此得出结论,这些都是 local 变量,这意味着将在函数内部完全忽略全局testflag1。反过来,这意味着仅在flag2flag1时才定义名称flag2if(因此,对于大于等于10的偶数,该函数将运行,但是否则将会崩溃)。

我提供的解决方案是使Trueflag1成为局部变量。您还可以通过将它们保留在函数外部,并向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