Ошибка Python: "IndexError: индекс строки вне диапазона"

В настоящее время я изучаю python из книги под названием "Python для абсолютного новичка (третье издание)". В книге есть упражнение, в котором описывается код для игры в палач. Я следил за этим кодом, но я все время возвращаю ошибку в середине программы.

Вот код, вызывающий проблему:

if guess in word:
    print("\nYes!", guess, "is in the word!")

    # Create a new variable (so_far) to contain the guess
    new = ""
    i = 0
    for i in range(len(word)):
        if guess == word[i]:
            new += guess
        else:
            new += so_far[i]
        so_far = new

Это также ошибка, которую он возвращает:

new += so_far[i]
IndexError: string index out of range

Может кто-нибудь помочь мне с тем, что происходит не так, и что я могу сделать, чтобы исправить это?

edit: Я инициализировал переменную so_far следующим образом:

so_far = "-" * len(word)

Ответ 1

Похоже, вы слишком сильно отшлифовали so_far = new. Попробуйте следующее:

if guess in word:
    print("\nYes!", guess, "is in the word!")

    # Create a new variable (so_far) to contain the guess
    new = ""
    i = 0
    for i in range(len(word)):
        if guess == word[i]:
            new += guess
        else:
            new += so_far[i]
    so_far = new # unindented this

Ответ 2

Вы повторяете одну строку (word), но затем используете индекс для поиска символа в so_far. Нет гарантии, что эти две строки имеют одинаковую длину.

Ответ 3

Эта ошибка произойдет, когда количество догадок (so_far) меньше длины слова. Пропустили ли вы инициализацию переменной so_far где-то, которая устанавливает ее как-то вроде

so_far = " " * len(word)

?

Edit:

попробуйте что-то вроде

print "%d / %d" % (new, so_far)

перед строкой, которая выдает ошибку, поэтому вы можете точно видеть, что пошло не так. Единственное, о чем я могу думать, это то, что so_far находится в другой области, и вы фактически не используете экземпляр, который вы думаете.

Ответ 4

В вашем коде было несколько проблем. Здесь у вас есть функциональная версия, которую вы можете проанализировать (Позволяет установить "привет" в качестве целевого слова):

word = 'hello'
so_far = "-" * len(word)       # Create variable so_far to contain the current guess

while word != so_far:          # if still not complete
    print(so_far)
    guess = input('>> ')       # get a char guess

    if guess in word:
        print("\nYes!", guess, "is in the word!")

        new = ""
        for i in range(len(word)):  
            if guess == word[i]:
                new += guess        # fill the position with new value
            else:
                new += so_far[i]    # same value as before
        so_far = new
    else:
        print("try_again")

print('finish')

Я попытался написать его для py3k с py2k ide, будьте осторожны с ошибками.