2012-12-10 52 views
-1

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

到我的功能的啓動,將打印的價值,我分配「猜測」。我真的不明白這個功能如何看待它的價值,並且可以打印它,但不能改變它。

如果任何人都可以expalin我爲什麼會這樣,我會很感激,我猜它是一個局部/全局的事情,但我真的不知道。

回答

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

+0

非常感謝,這確實爲我解決了一些問題。感謝您花時間回答現在看起來很愚蠢的問題。 – matt

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