Я просмотрел ряд тем, посвященных мутации и мутации списка, и все же я столкнулся с примером, что ни один из тех, что я смог найти, не разрешается. В частности, я экспериментировал с вложенным индексированием, поэтому я создал объект запутанного списка, который, вероятно, был бы «плохой практикой» в реальном мире. Но просто для обучения я хотел создать примеры индексов и решил также проверить их на мутацию. Этот объект видоизменяется, когда вы пытаетесь его скопировать (см. код ниже). Среди вещей, которые я пытался обойти, но которые не увенчались успехом, были следующие:
Документация Python описывает copy() и deepcopy(), но оказывается, что эти методы не существуют в списке (по крайней мере, это ошибка, которую я получаю).
x2 = x[:] должен решить проблему путем нарезки. Это тоже не работает с объектом, приведенным ниже (он все еще мутирует)
list2 = list(list1) - это работает с простыми списками, но не с сумасшедшим списком хранения смешанных объектов, приведенным ниже
Как бы я скопировал что-то подобное и не мутировал?
Я не рассчитываю когда-либо создать что-то подобное на самом деле, но меньшие смешанные списки объектов с теми же симптомами, вероятно, имеют допустимые варианты использования в реальном коде. Кто сможет это взломать, будем признательны...
Этот код был в блокноте Jupyter с Python 2.7:
import numpy as np
import pandas as pd
m3d=np.random.rand(3,4,5)
n3d=m3d.reshape(4,3,5)
o3d=np.random.rand(2,3,4,5)
# some simple arrays:
simp1=np.array([[1,2,3,4,5]])
simp2=np.array([[10,9,8,7,6]])
simp3=[11,12,13]
# a dictionary
dfrm1 = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'],
'year': [2000, 2001, 2002, 2001, 2002],
'population': [1.5, 1.7, 3.6, 2.4, 2.9]}
# convert dictionary to DataFrame
dfrm1 = pd.DataFrame(dfrm1)
trueSimp1=np.array([10,9,8,7,6])
crazyList = [simp1, m3d, simp2, n3d, simp3, dfrm1, o3d, trueSimp1]
Теперь, как мы создадим CrazyList2, чтобы он не мутировал после создания копии?
Среди неудачных попыток:
crazyList2 = list(crazyList)
crazyList3 = crazyList[:]
crazyList4 = crazyList[:-1]
crazyList4 = crazyList4.append(crazyList[7]) # 7 is last object in list
Чтобы проверить это... некоторые хорошие элементы нужно изменить в каждом списке и посмотреть, влияют ли они на другие:
crazyList3[7][1] = 13 # change value here in any one list and check the others
crazyList3[4][0] = 14 # change value here in any one list and check the others
В моих тестах они всегда это делали... доказывая мутацию, несмотря на разные способы, которыми я пытался ее обойти.
deepcopy
. - person Łukasz Rogalski   schedule 23.02.2017import copy
и вызыватьcopy.deepcopy(list)
Списки не имеют методаcopy
илиdeepcopy
(в python2) - person danidee   schedule 23.02.2017