分配前错误参考

时间:2012-12-10 17:23:29

标签: python reference variable-assignment

  

可能重复:
  referenced before assignment error in python


所以我开始尝试自学一点Python,我已经遇到了我的第一个错误 当我尝试在else语句中增加'猜测'(我希望能够显示它采取了多少猜测)时,我在赋值错误之前得到一个引用,我不明白,因为我已经指定'猜测'了功能开始前的值。

这是我的代码 -

import random

def guessFunc():
    guess = input("Guess a number between 1 and 10: \n")
    guess = int(guess)

    if guess == num:
        print("Congratulations, you got it right")

    else:
        guesses += 1 
        guessFunc()


num = random.randint(1,10)
guesses = 1
guessFunc()

让我更加困惑的是,如果我把

这个事实
print(guesses)

进入我的函数的开头,它将打印我指定的'猜测'的值。我真的只是不知道函数如何看到值并可以打印它,但不能改变它。

如果有人能告诉我为什么会这样,我会非常感激,我猜这是一个本地/全球的事情,但我真的不确定。

2 个答案:

答案 0 :(得分:2)

Python作用域允许外部作用域的值落入读取范围。因此,您可以使用print()语句来描述函数中的全局函数。

但是,当您要分配时,需要使用global语句告诉Python您要分配给全局值而不是本地值,这意味着如果您在{I}之前执行global guesses尝试分配给它,它会工作。因为你不在这里,它会看到赋值,因此假定你想要创建一个局部变量,但正如你所做的+=它需要新局部变量的现有值,当然这不是#39; t存在,导致错误。

请注意,全局变量通常被认为是不好的做法,最好避免使用全局变量,因为它们很难看到函数将要执行的操作。最好让函数返回一个值并使用它。

做你想做的更好的方法是这样的:

import random

def guessFunc():
    guesses = 0
    while guess != num:
        guess = input("Guess a number between 1 and 10: \n")
        guess = int(guess)
        guesses += 1 
    print("Congratulations, you got it right")
    return guesses

num = random.randint(1,10)
guesses = guessFunc()

首先我们使用while循环重复操作,因为递归未在Python中优化,然后我们返回从函数执行的猜测次数,并将其分配给guesses而不是使用全局变量。

答案 1 :(得分:0)

在函数中使用guesses是指该名称的局部变量。由于您尚未分配这样的局部变量,因此当您尝试从中读取时程序会失败。

您需要告诉解释器您要引用全局变量。

def guessFunc():
    global guesses
    guess = input("Guess a number between 1 and 10: \n")
    guess = int(guess)

    if guess == num:
        print("Congratulations, you got it right")

    else:
        guesses += 1 
        guessFunc()