У меня проблема с областями действия в Python, переменная, объявленная как глобальная, но все еще получает ошибку - PullRequest
0 голосов
/ 28 февраля 2019

Я пытаюсь сделать игру палачом и по какой-то причине даже после объявления переменной как глобальной (даже если в консоли она отмечена, она может быть напечатана после вызова и функции, и, как и ожидалось, проблем не было. Код приведен ниже,

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 голосов
/ 28 февраля 2019

hidden_word внутри функции wordFiller по-прежнему является локальной переменной этой функции.Попробуйте также сделать его глобальным в этой функции.

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)
0 голосов
/ 28 февраля 2019

Так же, как говорится в сообщении об ошибке, вы ссылались на hidden_word до того, как его присвоили.

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

В пределах wordFilter вы никогда не инициализировали hidden_word.Обязательно инициализируйте свои переменные перед их использованием.

...