【问题标题】:python - appending string to a list nontype errorpython - 将字符串附加到列表非类型错误
【发布时间】:2018-04-03 04:19:35
【问题描述】:

我正在编写一个刽子手游戏,我想将用户输入的字符添加到猜测列表中。 (忽略无错误检查)。然而,我仍然觉得这很烦人——“AttributeError: 'NoneType' object has no attribute 'append'”。

我的代码在 while 循环中在 guessList[] 上引发错误。

import random


wordlist=["chapman","machine","learning","computer","python","california",
      "jellybeans","coffee","laboratory","disneyland","library", "freedom",
      "happiness", "majority", "vexing", "undulation", "periphery", "exultant",
      "jeering", "trampoline","weirdo","blondie","bowtie","controller","completion"]
index=random.randint(0, len(wordlist) - 1) #selects a random integer from range of list
correctword=wordlist[index]
#declaring variables
maxGuesses = len(correctword) + 5
guessCounter = 0
sofar= []
win = False 
wordLetters = 0
whileloop = False
mainLoop = True
guessList = []

for char in correctword:
    sofar.append("_") #makes the list have only Dashes
    wordLetters = wordLetters + 1
#display the length of wordlist (done in loops)
# print(sofar)
# print(" ".join(sofar)) #joins the elements in sofar into a string

print("Hangman game! Let's begin")
print("*+_______________________________________________________+*\n")

def findInd(string, char):
    return [i for i, letter in enumerate(string) if letter == char]
    #This will be called to find all indexes of letter in CorrectWord. 

def find_letter(list):
    if not list:          
        return 0

    elif list[0] == l:  #check first element here for guessed letter
        return True

    elif find_letter(list[1:]):  # checked the first element, skip it and return the other elements of the list
        return True

    else: 
        return False

while (mainLoop == True):
    print ('The word to guess: ',  " ".join(sofar), wordLetters, "letters long")
    letter = raw_input("guess a letter: ")
    guessCounter = guessCounter +1

    l = letter
    if (find_letter(guessList) == True):
        print("You already guessed that letter!")
        guessCounter = guessCounter -1
        continue
    else:
        guessList.append(letter) #Here is where it declares "NonType Error"

    for char in correctword:
        if letter == char:
            print ("good guess")
            whileloop = True
            mainLoop = True

    if whileloop == False:
        print ("That letter is not in the word! Guess again. \n")
        mainLoop = True

    #will skip this loop if letter is wrong
    while (whileloop == True):
        for num in (findInd(correctword, letter)): #returns list of indexes
            sofar[num] = letter #Replaces the places in sofar with char
        whileloop = False;  
            #if (letter == char): 
            #index = correctword.find(letter)
            #sofar[index] = letter

    print("*+_______________________________________________________+*\n") 

    count = sofar.count("_")

    if count == 0:
        win = True
        break #exits the main while loop

    guessList = guessList.sort()
    print ("you have guessed these letters: ", guessList)
    print ("Guesses left: ", (maxGuesses-guessCounter))
    if guessCounter == maxGuesses:
        break #User has used all the guesses and not won.

#outside of While loop

if win == True:
    print ("CONGRADULATIONS! You won. The word was ", correctword)
    print (" Thanks for playing")
else:
    print ("heh you lose... Try again some time")

它指向“guessList.append(letter)”行。它必须返回无,因为当我打印guessList 时,我什么也没有。但我没有做经典的guessList = guessList.append(letter)。此外,奇怪的是,它运行一次会打印guessList = None,然后是第二次(当它检查guessList 中的重复字符时它会崩溃。

【问题讨论】:

  • 请给我们一个minimal reproducible example,它实际上重现了错误。如果我们假设guessList = [],则没有错误。实际代码中的问题在于,您将guessList 设置为None。这就是您需要修复的部分——而这部分不在您向我们展示的代码中,所以我们无法帮助您。
  • 你从未定义过guessList。所以你应该得到一个NameError
  • 不要使用全局变量。 find_letter 应该有 l 作为参数。
  • @l'L'l:看看 abarnert 的评论。这是一个问题,代码中没有显示。

标签: python list append


【解决方案1】:

使用您的整个代码,错误很明显。您没有经典的附加错误,但同样的错误:

guessList = guessList.sort()

sort 对列表进行就地排序并返回None

【讨论】:

  • 啊,英雄,谢谢。 Ofc 它发生在它下面,这就是它可以运行一次的原因
【解决方案2】:

根据@Daniel 对您的问题的评论。如果你没有声明一个变量,你会得到NameError。根据我的说法,您已将 guessList 声明为全局变量。有时 python 不能正确识别global variables。所以,你需要在函数中使用global关键字来指定它是一个全局变量。

所以你的代码应该在这样的函数中有global guessList

def main():
    global guessList
    while (mainLoop == True):
       print ('The word to guess: ',  " ".join(sofar), wordLetters, "letters long")
       letter = raw_input("guess a letter: ")
       guessCounter = guessCounter +1
       l = letter
       if (find_letter(guessList) == True):
            print("You already guessed that letter!")
            guessCounter = guessCounter -1
            continue
       else:
            guessList.append(letter)

如果不是这种情况,那么唯一可能的错误可能是以下任一错误。

  1. 您可能已将guessList 初始化为None。所以我重新分配为guessList=[]
  2. 如果您使用多个模块并相互引用,您可能尚未从模块中导入变量。如果是这样,
    • 将其导入为from module import guessList
    • 将其导入为import module 并用作module.guessList
  3. 如果声明并定义为guessList=[],您可能尚未声明和定义变量。

【讨论】:

  • 所以我应该把我的while循环放在一个“def main():”中,以便让guessList是全局的?因为现在它可以在while循环之外访问guessList,它似乎只是将它返回为“none”
  • 不,这只是一个例子。你没有解释程序。所以我给出了所有可能的解决方案。
  • 请以最少的细节发布问题并寻求答案。否则答案将取决于用户的猜测。
猜你喜欢
  • 2011-11-24
  • 1970-01-01
  • 2012-12-05
  • 2012-09-14
  • 2014-02-24
  • 2011-01-04
  • 2018-09-13
  • 2013-08-15
  • 1970-01-01
相关资源
最近更新 更多