Python. Вызов функции, которая применяет мутацию к объекту. Мутация не применяется в контексте вызова - PullRequest
0 голосов
/ 08 ноября 2019

У меня есть класс, у которого есть поле под названием tour. В этом классе у меня также есть функция, которая удаляет местоположение из тура.

удалить из класса Tour

def remove(self,location, to_print=False):


    location.tour_id = None
    index_to_delete = None

    if to_print:
        print("before removee" +str(len(self.tour_locations)))


    for i in range(0,len(self.tour_locations)):
        if self.tour_locations[i].id_ == location.id_:

            index_to_delete = i

    if index_to_delete is None:
        print("element not found")
        return
    else:
        del self.tour_locations[index_to_delete]



    if to_print:
        print("after removee" +str(len(self.tour_locations)))

Теперь я вызываю эту функцию откуда-то еще (НЕ В ТУР КЛАССЕ):

apply

def apply(self):

    tour_location = self.extra_information['tour_location']
    position = self.extra_information['position']
    tour= self.extra_information['tour']  
    origin_tour = self.solution.get_tour_by_id(tour_location.tour_id)
    destination_tour = self.solution.get_tour_by_id(tour.id_)

    if to_print:
        print("origin_tour before  " + str(origin_tour))
        print("dstination tour before" + str(destination_tour))

    origin_tour.remove(tour_location, to_print=to_print)
    destination_tour.insert_at(tour_location, position)


    if to_print:
        print("origin_tour after  " + str(origin_tour))
        print("dstination tour after" + str(destination_tour))
    return self.solution

Строка печати в классе печатает маршрут в соответствии с удалением местоположения.

Строка печати ("after") вФункция apply показывает тур без каких-либо изменений.

Как это происходит?

1 Ответ

0 голосов
/ 08 ноября 2019

Не следует использовать del, чтобы удалить элемент из списка. Вместо этого используйте list.pop(index) или list.remove(value). В вашем случае вы должны использовать list.pop(index), потому что вы хотите удалить элемент по определенному индексу из списка. Документация

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...