gpt4 book ai didi

python - 为什么不可变列表的浅拷贝和深拷贝没有区别

转载 作者:行者123 更新时间:2023-11-28 21:54:45 25 4
gpt4 key购买 nike

假设我有一个 python 列表 limmutables 组成。当我在做一个浅拷贝 和一个深拷贝,结果是一样的:

>>> 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

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

问候。

最佳答案

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

浅拷贝

根据 copy's source code , 不可变类型的浅拷贝是这样完成的

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 function ,

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

关于python - 为什么不可变列表的浅拷贝和深拷贝没有区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23730279/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com