Member 13494159 Ответов: 2

Ханойская башня, ошибка индекса


я делаю знаменитую игру "Ханойская башня", и у меня есть ошибка, когда я запускаю свой код. Итак, когда я запускаю его, вызывается IndexError: list index out of range, в строке 17, которая является " if new_disk <= self.content[0]:" в add_method.
Я видел, что Indexerror может быть вызван, если значение не находится в списке или вне диапазона, но я не знаю, в чем проблема в моем случае. Вот мой код:

Что я уже пробовал:

class HanoiT():

    def __init__(self, content=None):
        if content is None:
            self.content=[]
        else:
            self.content=content

    def addmethod(self, new_disk): #Add an element on the beginning of the list
        if new_disk <= self.content[0]:
            self.content.insert(0, new_disk)
        else:
            raise ValueError("No disk may be placed on top of a smaller disk")


    def deletemethod(self): #Delete the first element of a list
        self.content.pop(0)

    def affichage(self): #Method to print the list which represent the "disk" putted on the tower from the top to bottom
        for i in self.content:
            print(i, end=" ")

    def movedisk(self, Tsource, Ttarget): 
        Ttarget.addmethod(Tsource.content[0])
        Tsource.deletemethod()

    def movetower(self, N, Tour1, Tour3, Tour2):
        if N >= 1:
            self.movetower(N-1, Tour1, Tour2, Tour3)
            self.movedisk(Tour1, Tour3)
            self.movetower(N-1, Tour2, Tour3, Tour1)




N = 4
Tour1 = HanoiT([x for x in range(1, N+1)])
Tour1.affichage()
Tour2 = HanoiT([])
Tour3 = HanoiT([])
h = HanoiT()
h.movetower(N, Tour1, Tour2, Tour3)

Richard MacCutchan

Потому что self.content ничего не содержит.

2 Ответов

Рейтинг:
2

Patrice T

Цитата:
но я не знаю, в чем проблема в моем случае.

Используйте отладчик, чтобы увидеть, что делает ваш код, и проверить переменные в точке сбоя.

Существует инструмент, который позволяет вам видеть, что делает ваш код, его имя отладчик Это также отличный инструмент обучения, потому что он показывает вам реальность, и вы можете увидеть, какие ожидания соответствуют реальности.
Когда вы не понимаете, что делает ваш код или почему он делает то, что он делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]
27.3. ПДБ — отладчика Python — питон 3.6.1 документации[^]
Отладка в Python | Python покоряет Вселенную[^]
pdb – интерактивный отладчик - Python модуль недели[^]
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.


Member 13494159

Спасибо, я использовал печать в функциях, чтобы увидеть, где я был, и я нашел свою ошибку

Patrice T

Приятно это слышать. Дайте попробовать отладчик, это действительно полезно.

Если решение было полезным, примите его, оно скажет всем, что вопрос решен.

Рейтинг:
1

OriginalGriff

Если вы получаете ошибку "индекс вне диапазона", это означает, что вы пытались получить доступ к массиву или другой коллекции, но номер индекса, который вы пытались извлечь, не находится в коллекции - он либо отрицательный, либо больше, чем количество элементов в коллекции минус один (потому что индексы начинаются с нуля, поэтому если у вас есть два элемента в вашей коллекции, они индексируются через 0 и 1 соответственно).

В этом случае вы пытаетесь получить доступ только к одной коллекции с помощью этой строки: self.content и вы предоставляете фиксированный индекс нуля - так что коллекция не может иметь никаких элементов.
А почему бы и нет? Вероятно, потому, что в коллекцию еще не было добавлено никаких элементов, так что нет ничего, с чем можно было бы сравнить ценность.

Решение: измените условие if, чтобы проверить, пуста ли коллекция, прежде чем пытаться использовать это значение.


Member 13494159

Спасибо тебе, парень, мне удалось это исправить !

OriginalGriff

Всегда пожалуйста!