为什么for会创建无限循环?

时间:2018-09-13 00:09:12

标签: python python-3.x

我一直在尝试编码,并制作了这款小巧的hangman游戏

from random import randint
import sys

used_letters = []
life = 3

wordList = ['apple','bee','castle','house','train','computer','snake','program','cellphone','microphone']
word = wordList[randint(0,(len(wordList)-1))]
wordList = [letter for letter in word]
amountLetters = 0
word_holder = []

for letter in wordList:
    word_holder.append(amountLetters)
    amountLetters += 1


while life > 0:
    fail_counter = 0
    user_input = (input('What is your guess?')).lower()
    if user_input == word:
        print('You win')
        sys.exit(0)
    elif user_input == 'word':
        print(word_holder)
    elif user_input == 'letters':
        print(used_letters)
    elif wordList.count(user_input) > 0:
        for letter in wordList:
            if user_input == letter:
                indexNb = wordList.index(letter)
                word_holder.insert(indexNb, letter)
                wordList.insert(indexNb, '0')
                print(f'You found the letter {letter}')
    else:
        fail_counter = fail_counter + 1
        if fail_counter == len(wordList):
            print('You lost a life')
            used_letters.append(letter)
            life -= 1

if life == 0:
    print('You lose!')

我一直在尝试不同的方式来弥补这一点,但我做不到。这似乎是一个好方法,但它不断陷入无限循环,并用相同的字母重复打印。所以基本上我想知道为什么“ for”会进入无限循环,尽管“ wordList”中的“ letter”应该是有限的。

3 个答案:

答案 0 :(得分:1)

您正在insert进入当前正在检查的索引处的wordList,这意味着您将正在检查的letter推出一个(将{{1 }}的当前位置),意味着在下一个循环中再次找到它。

因此,在第一个循环中,在'0'中搜索'x',您会在索引['x', 'y', 'z']上找到x,然后是0 insert在该索引处,将'0'更新为list。在下一个循环中,它将['0', 'x', 'y', 'z']迭代器的内部索引从0推进到1,并将找到的值(再次list!)放入'x'中。然后letterinsert得到'0'。我认为您可以从这里开始遵循逻辑;您将['0', '0', 'x', 'y', 'z'] insert无限个,因为每个将您的目标推出另一个索引,然后您立即再次“找到”它。

答案 1 :(得分:0)

凭经验,wordList不是有限的:您在遍历它时会附加到它的后面,从而扩展了列表。在循环中使用print语句来跟踪您的值,您会发现问题所在。您在找到的字母前插入0。那封信被撞到了一个位置,您将在下一次执行时找到相同信。

    for letter in wordList:
        if user_input == letter:
            indexNb = wordList.index(letter)
            word_holder.insert(indexNb, letter)
            wordList.insert(indexNb, '0')
            print('You found the letter', letter)
            print('   wordList is now', wordList)

相反,请使用replace方法或从原始方法构建一个新字符串。例如,只需将此循环替换为

    wordList.replace(letter, '0')
    print('You found the letter', letter)

另外,请注意一个明显的问题:您正在处理整个wordList,而不仅仅是一个单词。我还没有修复那部分。

答案 2 :(得分:0)

欢迎来到Stackoverflow社区。 for循环中的以下行可能会导致无限循环,请更新您的代码。

wordList.insert(indexNb, '0')