我在Python中的作用域有问题,将变量声明为全局变量,但仍会出错

时间:2019-02-28 16:58:07

标签: python variables scope global-variables local

我正试图制作一个hang子手游戏,由于某种原因,即使在将变量声明为全局变量之后(即使在控制台中检查了它,也可以在调用并执行功能后将其打印出来,并且没有出现任何问题。) 代码如下,

import random

def wordRandomizer(categorie):
    randomNum = random.randint(0, len(categorie))
    #Picks a random number to pick a word from the list
    choosenWord = categorie[randomNum]
    #actually chooses the word
    global hidden_word
    #Globals the variable that I have the problem with
    hidden_word = "_" * len(choosenWord)
    return choosenWord

def wordFiller(word,letter):
    hidden_wordTemp = hidden_word.split()
    for i in range(len(word)):
        if word[i] == letter:
            hidden_wordTemp[i] = letter
        else:
            pass
    hidden_word = ''.join(hidden_wordTemp)
    print(hidden_word)

wordFiller(wordRandomizer(['book', 'bottle', 'door']), 'o')

错误输出如下:

Traceback (most recent call last):
  File "C:\Users\amitk\OneDrive\School\2018-2019 ט\Cyber\Hangman.py", line 295, in <module>
    wordFiller(wordRandomizer(['book', 'bottle', 'door']), 'o')
  File "C:\Users\amitk\OneDrive\School\2018-2019 ט\Cyber\Hangman.py", line 286, in wordFiller
    hidden_wordTemp = hidden_word.split()
UnboundLocalError: local variable 'hidden_word' referenced before assignment

由于某种原因,它表示即使已分配和“局部化”局部变量,也已在赋值之前对其进行了引用

2 个答案:

答案 0 :(得分:0)

就像错误消息所指出的那样,您在分配hidden_word之前已经对其进行了引用。

def wordFiller(word,letter):
    hidden_wordTemp = hidden_word.split()

wordFilter范围内,您从未初始化hidden_word。使用变量之前,请确保对其进行初始化。

答案 1 :(得分:0)

wordFiller函数内的

hidden_word仍然是该函数的局部变量。尝试在该函数中将其设置为全局。

def wordFiller(word,letter):
   global hidden_word
   hidden_wordTemp = hidden_word.split()
   // etc

此外,randint(start, end)函数包含开始和结束,因此您可能会生成结束值。那将超出数组的范围。试试这个吧。

  randomNum = random.randint(0, len(categorie) - 1)

最后,split()可能没有按照您的想象做。如果需要字符列表,请改用list(str)

 hidden_wordTemp = list(hidden_word)