首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么浅层复制和深拷贝对于不可变列表没有区别?

为什么浅层复制和深拷贝对于不可变列表没有区别?
EN

Stack Overflow用户
提问于 2014-05-19 05:31:34
回答 3查看 800关注 0票数 2

假设我在执行l浅拷贝和深拷贝时,有一个由immutables.组成的python列表,结果是相同的:

代码语言:javascript
运行
复制
>>> 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类型从不更改。但是,如果我们想要为这些类型的集合实现类似于的深拷贝行为,我们如何做到这一点?

致以问候。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-05-19 05:43:18

由于不能更改不可变对象,所以在复制时创建不可变对象的副本是没有意义的。

浅拷贝

根据's source code,不可变类型的浅拷贝如下所示

代码语言:javascript
运行
复制
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函数在浅层复制期间按原样返回对象。

深拷贝

同样,在元组的深度复制过程中,对象按原样返回,如 function所示,

代码语言:javascript
运行
复制
d = id(x)
try:
    return memo[d]
票数 3
EN

Stack Overflow用户

发布于 2014-05-19 05:53:17

第四部分解释了为什么没有区别。如果你想做任何事,你都可以通过腌制来实现:

代码语言:javascript
运行
复制
import pickle

a = (1,2)
b = (3,4)
l = [a,b]

z = pickle.loads(pickle.dumps(l))

print id(l[0])
print id(z[0])

显然,这不应该是必要的。

票数 2
EN

Stack Overflow用户

发布于 2014-05-19 16:38:56

针对这种特殊情况,对创建小整数对象进行了优化。即使在执行简单的任务时,您也可以观察到对象的相同标识,即使它们不应该相互了解:

代码语言:javascript
运行
复制
>>> a = 1
>>> b = 5
>>> c = 1
>>> d = 5
>>> id(a)
1815461288
>>> id(c)
1815461288
>>> id(b)
1815461352
>>> id(d)
1815461352
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23730279

复制
相关文章

相似问题

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