python - 两个列表的深拷贝
问题描述
我在python中有两个列表,它们以不同的方式(例如顺序)存储一些类实例。现在,我想出于某种目的创建这两个列表的副本(独立于现有列表)。为了清楚地说明我的问题,我在下面创建了一个演示代码。
import copy
class Node:
def __init__(self):
self.node_id = 0
node = Node()
list1 = [node]
list2 = [node]
u_list1 = copy.deepcopy(list1)
u_list2 = copy.deepcopy(list2)
id1 = id(list1[0])
id2 = id(list2[0])
u_id1 = id(u_list1[0])
u_id2 = id(u_list2[0])
通过使用 deepcopy 操作,我创建了两个独立于and的新列表u_list1
,这正是我所需要的。不过,我发现了一个问题。和中的节点实例现在也是独立的。它们在内存中有不同的地址。是否有可能相同的实例仍然共享一个地址,就像和中的实例一样?u_list2
list1
list2
u_list1
u_list2
u_list1
u_list2
list1
list2
我需要的是id1 = id2
, u_id1 = u_id2
, while id1 != u_id1
。
解决方案
您可以deepcopy
通过将它们一起深度复制来使用 's memo 方面:
u_list1, u_list2 = copy.deepcopy((list1, list2))
从文档(强调我的):
深拷贝操作通常存在两个浅拷贝操作不存在的问题:
递归对象(直接或间接包含对其自身的引用的复合对象)可能会导致递归循环。
因为深拷贝复制了它可能复制过多的所有内容,例如打算在副本之间共享的数据。
deepcopy() 函数通过以下方式避免这些问题:
- 保存在当前复制过程中已复制的对象的备忘录字典;和
推荐阅读
- python - 如何使用 webbrowser 从 Python 脚本启动 Microsoft Edge
- angular - 角度材质菜单
- scala - Spark:一台机器上有更多的执行者,每个任务的持续时间更长
- linux - 在 GLX 中使用 X11 转发时遇到问题
- elasticsearch - 将文档放入索引时发生 Elasticsearch 冲突
- python - Kivy - 如何使用自定义元数据/信息标记按钮或事件?
- css - CSS 变换动画在 Chrome 中不起作用
- api - Google 日历 API 免费插槽
- c++ - c++ queue.front(); 为什么不从第一个元素开始?
- c++ - 为什么这个选择排序算法仍然切换一个元素,当它已经是其余元素中的最小元素时?