【问题标题】:Reference Before Assignment Error [duplicate]分配错误之前的参考[重复]
【发布时间】:2012-11-28 03:49:09
【问题描述】:

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

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

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

【问题讨论】:

    标签: python reference variable-assignment


    【解决方案1】:

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

    【讨论】:

    • 非常感谢,这对我来说真的很清楚。感谢您抽出时间来回答这个现在看起来很愚蠢的问题。
    【解决方案2】:

    在函数中使用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()
    

    【讨论】:

      猜你喜欢
      • 2019-04-26
      • 2016-04-07
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 2018-05-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多