在赋值python3之前引用的局部变量

时间:2017-03-12 17:17:47

标签: python python-3.x local-variables

我尝试执行以下代码,

def dating_age (my_age):
    if my_age < 18 & my_age >= 13:
        girls_age = my_age/2+5
    elif my_age <13:
        print ("You are ineligible to date")
    else:
        girls_age = my_age/2+9
    return girls_age

my_age_input = int(input("Enter your age: "))
dating_limit = (dating_age(my_age_input))

if my_age_input < 13:
    print (dating_limit)
else:
    print ("I can date Girls of" , int(dating_limit) , "and higher")

并收到以下错误:

Enter your age: 12
You are ineligible to date
Traceback (most recent call last):
  File "C:/Users/animi/PycharmProjects/LearnPython/Functions.py", line 27, in <module>
    dating_limit = (dating_age(my_age_input))
  File "C:/Users/animi/PycharmProjects/LearnPython/Functions.py", line 24, in dating_age
    return girls_age
UnboundLocalError: local variable 'girls_age' referenced before assignment

Process finished with exit code 1

如果输入13以上的任何内容作为输入,则不会生成错误代码。为什么会发生这样的错误以及如何避免错误?

此外,欢迎任何改进我的编程习惯的提示。

3 个答案:

答案 0 :(得分:0)

&不是布尔运算符,而是使用and&运算符是按位运算符,与and运算符的优先级不同。

因此,您的测试解释如下:

my_age < (18 & my_age) >= 13

这确实是一个非常不同的测试。

使用

my_age < 18 and my_age >= 13

或使用链式比较:

13 <= my_age < 18

接下来,当年龄低于13时,您不会将girls_age设置为任何。你只打印,所以没有任何设置到本地,你得到你的错误。提高错误或返回虚拟值:

def dating_age (my_age):
    if 13 <= my_age < 18:
        girls_age = my_age / 2 + 5
    elif my_age < 13:
        print ("You are ineligible to date")
        return
    else:
        girls_age = my_age / 2 + 9
    return girls_age

您也可以直接返回值,并在my_age过低时提​​前退出;在这个例子中,我使用了一个异常,并使用条件表达式来简化计算:

def dating_age (my_age):
    if my_age < 13:
        raise ValueError("You are ineligible to date")
    return my_age / 2 + (5 if my_age < 18 else 9)

my_age_input = int(input("Enter your age: "))
try:
    dating_limit = dating_age(my_age_input)
except ValueError as ex:
    print(ex.args[0])
else:
    print("I can date girls of {} and higher".format(dating_limit))

答案 1 :(得分:0)

你的问题是你总是返回girls_age变量,而你只在两种情况下定义它。由于无意在第二种情况下定义它(你的年龄在13岁以下),你可以只返回年龄,只要你有一个年龄:

def dating_age (my_age):
    if my_age < 18 AND my_age >= 13:
        return (my_age/2+5)
    elif my_age <13:
        print ("You are ineligible to date")
    else:
        return (my_age/2+9)

答案 2 :(得分:0)

而不是其他编程语言,变量不会在Python中自动初始化。您必须在代码中初始化它们。

因此,当解释器到达return语句并且my_age < 13时,girls_age并不存在,并且Python不会自动初始化它。所以它抱怨没有现有变量:girls_age未分配。您应该在return之前设置它。