是什么导致赋值前引用的本地变量出错



我目前正在处理MIT问题集2,遇到了一个我已经修复的错误,但不明白为什么会发生。该代码的相关部分是可变字母表。我在函数is_word_guessedget_guessed_word中都引用了它。但是,当我运行代码时,我收到了get_guessed_word函数中赋值错误之前引用的Local变量。但是,我在这两个函数之外分配了变量。除此之外,函数is_word_guessed不会产生任何错误。

我可以通过在函数中指定字母表来修复错误,但我想了解错误的原因,以便学习。

  1. 两个函数都引用变量字母表(在函数外部分配(,但唯一的get_guessed_word尝试修改值
  2. 我可以假设这个错误源于变量的修改。但是,当我在同一代码中修改secret_word时,为什么不出现这个错误呢?(是因为secret_word是指定的参数吗?(
secret_word = 'apple'
letters_guessed = ['a','p','q']#['e', 'i', 'k', 'p', 'r', 's']
alphabet='abcdefghijklmnopqrstuvwxyz'

def is_word_guessed(secret_word, letters_guessed):
'''
secret_word: string, the word the user is guessing; assumes all letters are
lowercase
letters_guessed: list (of letters), which letters have been guessed so far;
assumes that all letters are lowercase
returns: boolean, True if all the letters of secret_word are in letters_guessed;
False otherwise
'''
secret_letters=set()
for l in secret_word:
if l in alphabet:
secret_letters.add(l)
print('Secret letters are ',secret_letters)
else:
pass
for l in letters_guessed:
if l in secret_letters:
secret_letters.remove(l)
print('Secret letters minus guessed letters are', secret_letters)
else:
pass
if len(secret_letters)==0:
return True
else:
return False

print(is_word_guessed(secret_word, letters_guessed))
def get_guessed_word(secret_word, letters_guessed):
'''
secret_word: string, the word the user is guessing
letters_guessed: list (of letters), which letters have been guessed so far
returns: string, comprised of letters, underscores (_), and spaces that represents
which letters in secret_word have been guessed so far.
'''
###alphabet='abcdefghijklmnopqrstuvwxyz'
for l in letters_guessed:
if l in alphabet:
alphabet=alphabet.replace(l,'')
print(alphabet)
for l in alphabet:
if l in secret_word:
secret_word=secret_word.replace(l,'_ ')
print(secret_word)
return secret_word
print(get_guessed_word(secret_word, letters_guessed))

提前感谢您的帮助。我知道这是一个常见的错误,但我读到的文章都没有涉及到我的具体问题。

问题的答案取决于您在get_guessed_work函数中分配字母表的事实。

当您在函数内部分配一个不可变变量(例如字符串(时,Python会自动将该变量视为局部变量,而不是全局变量。因此,alphabet现在是一个全局变量,您之前并没有定义它。您可以通过在函数声明中添加一个默认函数变量来解决这个问题:

def get_guessed_word(secret_word, letters_guessed,alphabet=alphabet):

希望有帮助!格言

您只需添加

global alphabet

secret_word = 'apple'
letters_guessed = ['a','p','q']#['e', 'i', 'k', 'p', 'r', 's']
alphabet='abcdefghijklmnopqrstuvwxyz'

def is_word_guessed(secret_word, letters_guessed):
'''
secret_word: string, the word the user is guessing; assumes all letters are
lowercase
letters_guessed: list (of letters), which letters have been guessed so far;
assumes that all letters are lowercase
returns: boolean, True if all the letters of secret_word are in letters_guessed;
False otherwise
'''
secret_letters=set()
for l in secret_word:
if l in alphabet:
secret_letters.add(l)
print('Secret letters are ',secret_letters)
else:
pass
for l in letters_guessed:
if l in secret_letters:
secret_letters.remove(l)
print('Secret letters minus guessed letters are', secret_letters)
else:
pass
if len(secret_letters)==0:
return True
else:
return False

print(is_word_guessed(secret_word, letters_guessed))
def get_guessed_word(secret_word, letters_guessed):
'''
secret_word: string, the word the user is guessing
letters_guessed: list (of letters), which letters have been guessed so far
returns: string, comprised of letters, underscores (_), and spaces that represent
which letters in secret_word have been guessed so far.
'''
global alphabet
for l in letters_guessed:
if l in alphabet:
alphabet=alphabet.replace(l,'')
print(alphabet)
for l in alphabet:
if l in secret_word:
secret_word=secret_word.replace(l,'_ ')
print(secret_word)
return secret_word
print(get_guessed_word(secret_word, letters_guessed))

提示:避免将函数参数命名为与变量相同的名称,因为这会使人感到困惑而且你应该经常使用

x = y

而不是

x=y

只是出于审美原因。

secret_word = 'apple'
letters_guessed = ['a','p','q']
alphabet = 'abcdefghijklmnopqrstuvwxyz'

def is_word_guessed(word, guess):
'''
secret_word: string, the word the user is guessing; assumes all letters are
lowercase
letters_guessed: list (of letters), which letters have been guessed so far;
assumes that all letters are lowercase
returns: boolean, True if all the letters of secret_word are in letters_guessed;
False otherwise
'''
secret_letters = set()
for l in word:
if l in alphabet:
secret_letters.add(l)
print('Secret letters are ',secret_letters)
else:
pass
for l in guess:
if l in secret_letters:
secret_letters.remove(l)
print('Secret letters minus guessed letters are', secret_letters)
else:
pass
if len(secret_letters) == 0:
return True
else:
return False

print(is_word_guessed(secret_word, letters_guessed))
def get_guessed_word(word, guess):
'''
secret_word: string, the word the user is guessing
letters_guessed: list (of letters), which letters have been guessed so far
returns: string, comprised of letters, underscores (_), and spaces that represent
which letters in secret_word have been guessed so far.
'''
global alphabet
for l in guess:
if l in alphabet:
alphabet = alphabet.replace(l,'')
print(alphabet)
for l in alphabet:
if l in word:
word = word.replace(l,'_ ')
print(word)
return word
print(get_guessed_word(secret_word, letters_guessed))

希望我能帮上忙。

最新更新