深度复制列表:超越浅层方法
当尝试使用 list(...) 复制列表时,人们可能会认为它创建了基于 id(E0) 与 id(E0_copy) 不同的观察的深度复制。然而,这个假设是有缺陷的。
浅复制陷阱
list(...) 不执行深复制,这涉及递归复制内部对象。相反,它只复制最外面的列表,保留对原始内部列表的引用。因此,对内部列表的修改会影响原始列表和复制的列表。
使用 copy.deepcopy 进行深度复制
要创建真正的深度复制,请使用 copy。深复制(...)。此方法递归复制所有级别的对象,确保对副本的更改不会影响原始对象。
示例
考虑以下代码片段:
>>> a = [[1, 2, 3], [4, 5, 6]] >>> b = list(a) >>> a [[1, 2, 3], [4, 5, 6]] >>> b [[1, 2, 3], [4, 5, 6]] >>> a[0][1] = 10 >>> a [[1, 10, 3], [4, 5, 6]] >>> b # b changes too -> Not a deepcopy. [[1, 10, 3], [4, 5, 6]]
在此示例中,list(...) 创建 a 的浅表副本。当a[0][1]被修改时,b也会改变,表明它们引用了相同的内部列表。
将此与以下内容进行对比:
>>> import copy >>> b = copy.deepcopy(a) >>> a [[1, 10, 3], [4, 5, 6]] >>> b [[1, 10, 3], [4, 5, 6]] >>> a[0][1] = 9 >>> a [[1, 9, 3], [4, 5, 6]] >>> b # b doesn't change -> Deep Copy [[1, 10, 3], [4, 5, 6]]
使用copy.deepcopy,我们创建 a 的真正深层副本。对 a 的更改不会影响 b,确认它们是具有自己的内部列表副本的不同对象。
结论
当深度复制列表是必要的时,请记住使用 copy.deepcopy(...) 确保对副本的更改不会影响原始副本。这种理解对于维护数据完整性和避免代码中出现意外后果至关重要。
以上是Python 列表中的浅拷贝与深拷贝:什么时候应该使用 `copy.deepcopy()`?的详细内容。更多信息请关注PHP中文网其他相关文章!