为什么不可变列表的浅表副本和深表副本之间没有区别

darxtrix

假设我有一个l包含以下内容的python列表immutables.当我执行浅表复制深表复制时,结果是相同的:

>>> a = (1,2) # immutable types
>>> b = (3,4)
>>> l = [a,b] # a list containing immutable types

>>> import copy
>>> y = copy.copy(l) # shallow copy
>>> z = copy.deepcopy(l) # deep copy

>>> id(l[0])
139857440375584
>>> id(y[0])
139857440375584
>>> id(z[0])
139857440375584 # all have the same id's , so all refer to the same object

这是否意味着浅拷贝深拷贝仅对mutable类型的集合有意义,因为immutable类型永远不会改变。但是,如果我们想为这些类型的集合实现类似行为深层复制,我们该怎么做?

问候。

四人

由于您不能更改不可变对象,因此在复制时创建相同对象的副本是没有意义的。

浅拷贝

根据copy源代码,像这样完成不可变类型的浅表复制

def _copy_immutable(x):
    return x

for t in (type(None), int, long, float, bool, str, tuple,
          frozenset, type, xrange, types.ClassType,
          types.BuiltinFunctionType, type(Ellipsis),
          types.FunctionType, weakref.ref):
    d[t] = _copy_immutable

对于所有不可变类型,该_copy_immutable函数在浅表复制期间按原样返回对象。

深度复制

以同样的方式,在元组的深层复制期间,根据_deepcopy_tuple函数按原样返回对象

d = id(x)
try:
    return memo[d]

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么不可变列表的浅表副本和深表副本之间没有区别

来自分类Dev

使用JavaScript数组的浅表副本和深表副本之间有什么区别?

来自分类Dev

使用JavaScript数组的浅表副本和深表副本之间有什么区别?

来自分类Dev

setState是响应中的浅表副本或深表副本

来自分类Dev

Kafka分区和Kafka副本之间有什么区别?

来自分类Dev

为什么可以突变状态的浅表副本?

来自分类Dev

为什么说NSString的可变副本等于原始的不可变副本?

来自分类Dev

制作矩阵副本(列表列表)后,为什么对副本进行双索引会更改原始副本,而索引却没有呢?

来自分类Dev

为什么要为自己设置字典浅表副本?

来自分类Dev

匿名类会在Java中获得最终变量的浅表副本还是深表副本?

来自分类Dev

mongodb地图集中的群集和副本集之间有什么区别?

来自分类Dev

了解副本和可变副本

来自分类Dev

可变值和不可变值重新定义之间有什么区别?

来自分类Dev

核心数据中的可变和不可变管理对象模型之间有什么区别?

来自分类Dev

为什么对于简单列表,浅表复制会表现为深表复制

来自分类Dev

有人可以解释深层副本和防御性副本之间的区别吗?

来自分类Dev

“另存为”和“保存副本”有什么区别?

来自分类Dev

“另存为”和“保存副本”有什么区别?

来自分类Dev

Python为什么要创建不必要的不可变对象副本?

来自分类Dev

Python为什么要创建不必要的不可变对象副本?

来自分类Dev

什么时候使用浅表副本?

来自分类Dev

隐式声明的副本构造函数与隐式定义的副本构造函数之间有什么区别?

来自分类Dev

从方法返回可变对象的不可变副本

来自分类Dev

按位复制和浅表复制之间有什么区别吗?

来自分类Dev

清单清单的浅表副本

来自分类Dev

清单清单的浅表副本

来自分类Dev

不可变和const成员函数有什么区别?

来自分类Dev

不可变和const成员函数有什么区别?

来自分类Dev

为什么有副本时使用分片

Related 相关文章

  1. 1

    为什么不可变列表的浅表副本和深表副本之间没有区别

  2. 2

    使用JavaScript数组的浅表副本和深表副本之间有什么区别?

  3. 3

    使用JavaScript数组的浅表副本和深表副本之间有什么区别?

  4. 4

    setState是响应中的浅表副本或深表副本

  5. 5

    Kafka分区和Kafka副本之间有什么区别?

  6. 6

    为什么可以突变状态的浅表副本?

  7. 7

    为什么说NSString的可变副本等于原始的不可变副本?

  8. 8

    制作矩阵副本(列表列表)后,为什么对副本进行双索引会更改原始副本,而索引却没有呢?

  9. 9

    为什么要为自己设置字典浅表副本?

  10. 10

    匿名类会在Java中获得最终变量的浅表副本还是深表副本?

  11. 11

    mongodb地图集中的群集和副本集之间有什么区别?

  12. 12

    了解副本和可变副本

  13. 13

    可变值和不可变值重新定义之间有什么区别?

  14. 14

    核心数据中的可变和不可变管理对象模型之间有什么区别?

  15. 15

    为什么对于简单列表,浅表复制会表现为深表复制

  16. 16

    有人可以解释深层副本和防御性副本之间的区别吗?

  17. 17

    “另存为”和“保存副本”有什么区别?

  18. 18

    “另存为”和“保存副本”有什么区别?

  19. 19

    Python为什么要创建不必要的不可变对象副本?

  20. 20

    Python为什么要创建不必要的不可变对象副本?

  21. 21

    什么时候使用浅表副本?

  22. 22

    隐式声明的副本构造函数与隐式定义的副本构造函数之间有什么区别?

  23. 23

    从方法返回可变对象的不可变副本

  24. 24

    按位复制和浅表复制之间有什么区别吗?

  25. 25

    清单清单的浅表副本

  26. 26

    清单清单的浅表副本

  27. 27

    不可变和const成员函数有什么区别?

  28. 28

    不可变和const成员函数有什么区别?

  29. 29

    为什么有副本时使用分片

热门标签

归档