【问题标题】:Local Variable referenced before assignment python3分配python3之前引用的局部变量
【发布时间】:2017-03-12 17:17:46
【问题描述】:

我尝试执行以下代码,

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 以上的任何内容作为输入,则不会生成错误代码。为什么会出现这样的错误以及如何避免?

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

【问题讨论】:

  • 年龄小于 13 岁时忘记初始化少女
  • 我该怎么做? @AnkurJyotiPhukan
  • 只是在elif my_age &lt;13: print ("You are ineligible to date")987654323@之后将少女初始化为一些东西
  • 哦,好的,谢谢!完成!
  • 好吧,对不起,我是新来的

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


【解决方案1】:

&amp; 不是布尔运算符,请改用and&amp; 运算符是位运算符,其优先级与and 运算符不同。

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

my_age < (18 & my_age) >= 13

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

使用

my_age < 18 and my_age >= 13

或使用链式比较:

13 <= my_age < 18

接下来,当年龄低于 13 岁时,您不要将girls_age 设置为anything。您只打印,因此该本地没有设置任何内容,您会收到错误。要么引发错误,要么返回一个虚拟值:

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))

【讨论】:

    【解决方案2】:

    您的问题是您总是返回 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)
    

    【讨论】:

    • 另一个提示:你正在定义一个函数,它应该只有一个函数......听起来很奇怪......但是:你的函数检查你是否能够约会,哪个年龄适合约会并将东西打印到外壳......
    【解决方案3】:

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

    因此,当解释器到达return 语句和my_age &lt; 13 时,girls_age 并不真正存在,Python 不会自动初始化它。所以它抱怨没有现有的变量:girls_age 没有分配。你应该在return之前设置它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多