Почему python думает, что я не определил свои переменные?

#python

Вопрос:

Я написал игру «Палач», чтобы играть с компьютером. Он выбирает слово из другого файла python под названием «слова», и вы угадываете буквы. Но не имеет значения, где я определяю свои имена, всегда говорится, что они не определены.

 > line 20, in <module> > while len(word_letters) > 0:  > NameError: name 'word_letters' is not defined  > line 27, in <module> > while len(word) > 0: > NameError: name 'word' is not defined  > line 31, in <module> > while len(alphabet) > 0: > NameError: name 'alphabet' is not defined  

Я определил свои переменные в def hangman, так почему же он не взаимодействует. Нужно ли мне где-то устанавливать его в качестве глобальной переменной?

 import random from words import words  import string  def get_valid_word(words):  word = random.choice(words) # randomly chooses something from the list  while '-' in words or ' ' in word:  word = random.choice(words)   return word  def hangman():  word = get_valid_word(words)  word_letters = set(word)  alphabet = set(string.ascii_uppercase)  used_letters = set() # what the user has guessed already   #getting user input   word_letters = set(word) while len(word_letters) > 0:   word = random.choice(words)  word_letters = set(word)  alphabet = set(string.ascii_uppercase)  used_letters = set() # what the user has guessed already   # letters they already used  # ' '.join (['a', 'b', 'cd']) --> 'a b c d'  print('You have used these already: ', ' '.join(used_letters))   # what current word is (ie W - R D)  word_list = [letter if letter in used_letters else '-' for letter in word]  print('Current word: ', ' '.join(word_list))   user_letter =input('Guess a letter').upper()  if user_letter in alphabet - used_letters:  used_letters.add(user_letter)  if user_letter in word_letters:  word_letters.remove(user_letter)   elif user_letter in used_letters:  print('You have already used that character. Please try again.')   else:  print('You didn't type in a valid character. Please try again.')  # gets here when len(word_letters) == 0  user_input = input('Type something:') print(user_input)  

Комментарии:

1. word_letters определяется только в области действия hangman метода, поэтому объекты за пределами этой области не могут получить к нему доступ.

2. Ваш цикл не является частью функции, в которой определены переменные. Вам нужно сделать отступ.

Ответ №1:

Вам нужно исправить отступ в строке 24 while и исправить, чтобы имена переменных имели уникальные имена, которые не совпадают с именами импорта

 import random import string  from words import words   def get_valid_word(words_var):  word = random.choice(words_var) # randomly chooses something from the list  while '-' in words_var or ' ' in word:  word = random.choice(words_var)   return word   def hangman():  word = get_valid_word(words)  word_letters = set(word)  alphabet = set(string.ascii_uppercase)  used_letters = set() # what the user has guessed already   # getting user input  word_letters = set(word)   while len(word_letters) > 0:   word = random.choice(words)  word_letters = set(word)  alphabet = set(string.ascii_uppercase)  used_letters = set() # what the user has guessed already   # letters they already used  # ' '.join (['a', 'b', 'cd']) --> 'a b c d'  print('You have used these already: ', ' '.join(used_letters))   # what current word is (ie W - R D)  word_list = [letter if letter in used_letters else '-' for letter in word]  print('Current word: ', ' '.join(word_list))   user_letter = input('Guess a letter').upper()  if user_letter in alphabet - used_letters:  used_letters.add(user_letter)  if user_letter in word_letters:  word_letters.remove(user_letter)   elif user_letter in used_letters:  print('You have already used that character. Please try again.')   else:  print('You didn't type in a valid character. Please try again.')   # gets here when len(word_letters) == 0  user_input = input('Type something:') print(user_input)  

Ответ №2:

В дополнение к тому, что другие сказали относительно отступа, я не вижу вызовов hangman функции. Это означает, что эти ценности никогда не инициируются с самого начала. Я бы позвонил в конце вашей программы, чтобы начать весь процесс. Что-то вроде:

 hangman()  user_input = input('Type something:')  print(user_input)