-1

可能重复:
在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)

在我的函数开始时,它将打印我分配的“猜测”值。我真的只是不明白该函数如何查看该值并可以打印它,但无法更改它。

如果有人可以向我解释为什么会发生这种情况,我将非常感激,我猜这是本地/全球的事情,但我真的不确定。

4

2 回答 2

2

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

但是,当您要分配时,您需要使用global语句告诉 Python 您要分配给全局值,而不是局部值,这意味着如果您global guesses在尝试分配之前这样做,它将起作用。由于您不在这里,它会看到分配,因此假定您要创建一个局部变量,但是当您这样做+=时,它需要新局部变量的现有值,这当然不存在,从而导致错误.

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

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

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而不是使用全局变量。

于 2012-12-10T17:26:09.820 回答
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()
于 2012-12-10T17:26:33.107 回答