首页 >后端开发 >Python教程 >Python 列表中的浅拷贝与深拷贝:什么时候应该使用 `copy.deepcopy()`?

Python 列表中的浅拷贝与深拷贝:什么时候应该使用 `copy.deepcopy()`?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-09 20:51:11806浏览

Shallow vs. Deep Copy in Python Lists: When Should I Use `copy.deepcopy()`?

深度复制列表:超越浅层方法

当尝试使用 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn