Создайте копию списка, не ссылающегося на содержащиеся объекты

Скажем, у меня есть вектор a определенный как:

 a = [[1,2,3],[-1,-2,-3]] 

Я узнал, что для создания копии объекта a без ссылки на него я должен использовать следующий синтаксис:

 b = a[:] 

Действительно, если я выполню следующие утверждения:

 b = [] print a 

выход

 >>> [[1,2,3],[-1,-2,-3]] 

точно так же, как я ожидал. Хотя, если я сделаю следующее:

 b = a[:] b[0][2] = 'change a' print a 

выход

 >>> [[1,2,'change a'],[-1,-2,-3]] 

Поэтому мне ясно, что объект a[0] ссылается, даже если он содержится в a . Как я могу создать копию объекта a так, чтобы даже все его внутренние объекты не ссылались?

Для этого используйте deepcopy :

 >>> from copy import deepcopy >>> b = deepcopy(a) >>> b[0][2] = 'change a' >>> print a [[1,2,3],[-1,-2,-3]] 

Deepcopy: https://docs.python.org/2/library/copy.html#copy.deepcopy

расширение

Deepcopy также создает отдельную копию экземпляров класса. См. Простой пример ниже.

 from copy import deepcopy class A: def __init__(self): self.val = 'A' >>> a = A() >>> b = deepcopy(a) >>> b.val = 'B' >>> print a.val 'A' >>> print b.val 'B' 

a[:] создает мелкую копию списка.

Вы можете использовать copy.deepcopy() для рекурсивной копирования объектов или использования списка:

 b = [el[:] for el in a] 

Это создает новый объект списка с неглубокими копиями вложенных объектов списка в a .

Если вы только «мелкая копия» b = a[:] , каждый под-список b[n] все еще является ссылкой на тот же список, на который ссылается на a[n] . Вместо этого вам нужно сделать глубокую (er) копию, например,

 b = [l[:] for l in a] 

Это создает мелкую копию каждого под-списка, но поскольку их содержимое является неизменным, что не является проблемой. Если у вас больше уровней вложенности контейнеров, вам нужно copy.deepcopy как предлагают другие ответы.

Использовать copy.deepcopy

 import copy b = copy.deepcopy(a) 

Цитирование документов:

Глубокая копия создает новый составной объект, а затем рекурсивно вставляет в него копии объектов, найденных в оригинале

Пример:

 >>> a = list(range(1000)) >>> b = copy.deepcopy(a) >>> a is b # b is a new object False >>>