首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >np.copy(obj) vs obj.copy() vs copy.copy(obj) vs copy.deepcopy(obj)

np.copy(obj) vs obj.copy() vs copy.copy(obj) vs copy.deepcopy(obj)
EN

Stack Overflow用户
提问于 2022-03-15 01:10:33
回答 1查看 28关注 0票数 0

np.copy(obj) vs obj.copy() vs copy.copy(obj) vs copy.deepcopy(obj)

我看到,基本上有四种方法可以用来复制Python中的对象。

我对这四种不同之处并不十分清楚。

请有人从地面上解释一下差异。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-15 03:00:59

TL;DR --它们在复制方法上有所不同:

  • 浅版:
    • numpy.copy()
    • (dict | list | ...).copy()
    • copy.copy()

  • 深版:
    • copy.deepcopy()

也是出于以下目的:

  • 复制数据结构:
    • numpy.copy()
    • (dict | list | ...).copy()

  • 复制对象(数据结构⊂对象):⊂
  • copy.copy()
  • copy.deepcopy()

此外,如果存在,copy.copy()copy.deepcopy()将分别在内部调用obj.__copy__()obj.__deepcopy__()方法,这意味着用户类可以控制复制行为。

浅拷贝与深拷贝的解释

python中有两种拷贝:浅拷贝和深拷贝。

来自Python文档

浅复制和深度复制之间的区别仅适用于复合对象(包含其他对象的对象,如列表或类实例):

  • 浅拷贝构造一个新的复合对象,然后(尽可能地)将引用插入到原始对象中。
  • 深度复制构造一个新的复合对象,然后递归地将插入原始对象中的对象的

这种差异最好在复制类实例时显示。

代码语言:javascript
复制
>>> class SomeClass:
...     pass

>>> a = [SomeClass()]
>>> b = a.copy()

>>> a[0] == b[0]
True

>>> id(a[0])
2778700770576
>>> id(b[0])
2778700770576

# Not actually copied, referencing to same instance.
代码语言:javascript
复制
>>> import copy
>>> a = [SomeClass()]
>>> b = copy.deepcopy(a)

>>> a[0] == b[0]
False

>>> id(a[0])
2778695702544
>>> id(b[0])
2778717746032

# Actually copied into different instance

对于浅拷贝,如果您的数据包含复合对象(最常见的是listdict、用户类等),并且您必须使用它,请确保使用深度复制以避免以下情况:

代码语言:javascript
复制
>>> a = [[0], [0]]
>>> b = a.copy()

>>> b[0].append(10)

>>> a
[[0, 10], [0]]
>>> b
[[0, 10], [0]]

# ---

>>> a = [[0], [0]]
>>> b = copy.deepcopy(a)

>>> b[0].append(10)

>>> a
[[0], [0]]
>>> b
[[0, 10], [0]]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71475896

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档