为什么切片比python中的deepcopy快得多?

为什么切片比python中的deepcopy快得多?,python,copy,Python,Copy,从和其他来源,通过切片进行复制比copy.deepcopy快1000倍 为什么会这样?python实现切片和deepcopy的方式是什么导致了如此巨大的差异?这与python管理内存的方式有关吗 我不认为切片是肤浅的复制。 例如,使用如下代码: cur = [[0] * (2) for _ in xrange(2)] cur2 = [row[:] for row in cur] cur2[0][0] = "foo" print(cur) print(cur

从和其他来源,通过切片进行复制比copy.deepcopy快1000倍

为什么会这样?python实现切片和deepcopy的方式是什么导致了如此巨大的差异?这与python管理内存的方式有关吗

我不认为切片是肤浅的复制。 例如,使用如下代码:

    cur = [[0] * (2) for _ in xrange(2)]
    cur2 = [row[:] for row in cur]
    cur2[0][0] = "foo"
    print(cur)
    print(cur2)
我得到:

[[0, 0], [0, 0]] # cur
[['foo', 0], [0, 0]] # cur2

谢谢。

切片返回浅拷贝,而不是深拷贝。这意味着容器中的对象不会在内存中复制-只保留对该对象的引用

链接答案本质上是一个列表列表:

x = [[0,1,2],
     [3,4,5],
     [6,7,8]]
切片列表(例如,
x[:1]
)将返回列表的副本,但不会复制该列表的单个元素。修改切片中的元素将依次修改原始列表中的元素


copy.deepcopy
复制原始列表,但也复制任何嵌套元素。这需要更多的工作,这也是速度较慢的原因。值得注意的是,只有当元素是可变的时才需要深度拷贝。对于不可变对象(如字符串),不需要深度复制-浅层复制就足够了。

.deepcopy创建一个新对象,然后将原始列表中的每个对象复制到该新对象中。切片执行与.copy(浅拷贝)相同的功能,即生成新对象,但仅插入对原始列表对象的引用。请参见

因为切片是浅拷贝,而不是深拷贝?请参见我的编辑:我不认为它是浅拷贝,因为当我更改cur2时,cur没有更改。如果我弄错了,请告诉我。嗯,但是如果我运行以下代码:cur=[[0]*(2)for uuxRange(2)]cur2=[row[:]for row in cur]cur2[0][0]=“foo”print(cur)print(cur2),那么结果是:cur:[[0,0]]cur2:['foo',0],[0,0]]如果它是一个浅拷贝,则不会出现这种情况。@user1552700重新读取代码。您没有复制高级列表(即,
cur[:]
),而是复制了每个嵌套列表,因此您对cur中的行的列表理解为
row[:]。这些都是不同的列表。如果您感兴趣,请查看身份测试(
id
函数),并在切片时阅读内部内容。