【问题标题】:What is causing Local variable referenced before assignment Error?是什么导致分配错误之前引用的局部变量?
【发布时间】:2020-10-31 21:39:02
【问题描述】:

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

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

  1. 两个函数都引用了变量Alphabet(在函数外部分配),但唯一的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))

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

【问题讨论】:

  • 它“被”定义了,但是你注释掉了它,所以......它不是。错误是正确的。您可能应该使用不同的名称,以免您认为它是全球字母表。

标签: python local-variables


【解决方案1】:

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

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

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

希望对您有所帮助! 马克西姆。

【讨论】:

    【解决方案2】:

    你可以添加

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

    希望我能帮上忙。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-07
      • 1970-01-01
      • 2018-07-16
      • 2019-06-06
      • 2015-06-08
      • 2014-08-20
      • 1970-01-01
      相关资源
      最近更新 更多