#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
модуль.