Как создать копию списка?

#python

#python

Вопрос:

У меня есть функция:

 def mutate(self, index):
    ing1, ing2 = random.randrange(8), random.randrange(8)
    while ing1 == ing2:
        ing2 = random.randrange(8)
    ptr = self.drinkList[index].ing[:]
    ing1thr = ptr[ing1].max - ptr[ing1].perc
    ing2thr = ptr[ing2].perc - ptr[ing2].min
    mutatedFitness = 0
    if ing1thr amp; ing2thr:
        change = random.randrange(ing1thr if ing1thr < ing2thr else ing2thr)
        ptr[ing1].perc  = change
        ptr[ing2].perc -= change
    for x in ptr:
        mutatedFitness  = x.perc * x.price
    mutatedFitness = 280000 - mutatedFitness
    if mutatedFitness > self.drinkList[index].fitness:
        self.drinkList[index].ing = ptr[:]
  

Теперь я хочу, чтобы ptr был копией self.drinkList[index].ing list , но в отладчике я заметил, что он указывает на сам объект вместо создания копии. Я думал, что нарезка — это способ избежать этого, где я допустил ошибку?

Комментарии:

1. Нарезка должна сделать это, так что я не вижу ничего плохого в вашем коде. Пробуем распечатать id(ptr) и id(self.drinkList[index].ing) — вы видите два разных значения?

2. Хорошо, я решил это с помощью copy.deepcopy(). Вложенный список по-прежнему указывал на те же объекты.

3. Что здесь должно означать «ptr»? Или «thr»? Или «perc»?

Ответ №1:

Развивая то, что сказал скрат

 import copy
new_list = copy.deepcopy(old_list)
  

Ответ №2:

Нарезка создает view объект afaik. Используйте copy модуль.