Создайте копию списка, не ссылающегося на содержащиеся объекты
Скажем, у меня есть вектор 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
так, чтобы даже все его внутренние объекты не ссылались?
- Проверьте, отображается ли имя атрибута объекта в строке python
- Создание объекта Python
- Python – Удаление объекта из списка
- Как разрезать список объектов в ассоциации атрибутов объекта
- Строка для объекта в Python
Для этого используйте 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 >>>
- Как преобразовать объект в массив
- Попытка создать объект через вход пользователя
- Перечислить преобразование объектов в integer
- python sqlAlchemy: получил InvalidRequestError после местоположения класса изменений
- Могу ли я изменить __name__ атрибут объекта в python?
- API-интерфейс Blender Python добавляет свойство к объекту
- Метод Python по умолчанию / без имени
- Передайте объект класса C # в файл Python
- «Включение» сравнения для классов