#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
) могут произойти две вещи (в следующем порядке):
- Он вызывает
if self._entities_list[i].__eq__(entity)
. - Он вызывает
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