Когда я пытаюсь удалить объект из списка, он никогда не сообщает мне, что он был найден

#python #list #python-3.8

#python #Список #python-3.8

Вопрос:

Когда я пытаюсь удалить объект из списка, он никогда не находит его и сообщает мне, что имени нет в списке. Я пытался получить название self._entitiesList[i] и название объекта, но я не нашел способа сделать это. Я работаю на python 3.8. Класс, который имеет 4 атрибута: название, исполнитель, жанр и продолжительность.

Репозиторий:

 def __init__(self):
    self._entitiesList = []

def find_position(self, entity):
    """
    Function that returns the position of an entity
    :param entity: (object) given entity
    :return: (int) position of entity, -1 if not found
    """
    for i in range(len(self._entitiesList)):
        if self._entitiesList[i] == entity:
            return i
    return -1

def delete(self, entity):
    """
    Function that deletes a given entity
    :raise Exception: if entity does not exists
    :param entity: (object) given entity
    """
    position = self.find_position(entity)
    if position == -1:
        raise Exception("Does not exist!")
    del self._entitiesList[position]
  

Обслуживание:

 def delete_song(self, title, artist, genre, ):
    """
    Function that deletes a song by title
    :param title: (str) song title
    """
    self._music_repository.delete(Music(title, artist, genre, float(0)))
  

для консоли:

 def __delete_song(self):
    title = input("Title: ")
    self.__music_service.delete_song(title)
  

Ответ №1:

Вы создаете новый Music объект, которому вы передаете self._music_repository.delete , который, конечно, не существует в вашем списке, поскольку он только что был создан.

При сравнении пользовательских объектов (как вы делаете с if self._entities_list[i] == entity ) могут произойти две вещи (в следующем порядке):

  1. Он вызывает if self._entities_list[i].__eq__(entity) .
  2. Он вызывает if self._entities_list[i] is entity .

Поскольку вы не определили метод сравнения def __eq__(self, other) , python выполнит второй вариант и проверит идентичность. Идентичность — это не то же самое, что равенство.

Определите метод сравнения на Music , и вы должны иметь возможность сравнивать равенство.

 def __eq__(self, other):
    if self.title == other.title and self.artist == other.artist:
        return True
    else:
        return False
  

Я предпочитаю говорить, что музыка с одинаковым названием и одним и тем же исполнителем одинаковы, но вам придется определить логику так, как вы считаете нужным.


В своем ответе я заменил ваш self._entitiesList на self._entities_list . Всегда придерживайтесь своего именования и старайтесь следовать соглашению об именовании PEP8, если у вас нет веских причин не делать этого.


Чтобы подробнее рассказать о разнице между идентичностью и равенством, рассмотрим следующее:

 a = ['hello']
b = ['hello']
c = a
  

Здесь a и b равны, но имеют разный идентификатор, в то время как a и c равны с одним и тем же идентификатором. Другими словами:

 a is b  # False
a is c  # True