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

时间:2018-08-05 06:54:47

标签: python copy

this answer和其他来源来看,通过切片进行的复制比copy.deepcopy快1000倍。

这是为什么? python实现导致如此巨大差异的切片和深度复制的方式是什么? 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

谢谢。

2 个答案:

答案 0 :(得分:3)

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

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

x = [[0,1,2],
     [3,4,5],
     [6,7,8]]

切片列表(例如x[:1])将返回列表的副本,但不会复制该列表的各个元素。修改切片中的元素将依次修改原始列表中的元素。

copy.deepcopy复制原始列表,但也复制任何嵌套元素。这需要更多的工作,这就是它速度较慢的原因。请注意,仅当元素可变时才需要深层副本。对于诸如字符串之类的不可变对象,则不需要深拷贝-浅拷贝就足够了。

答案 1 :(得分:0)

.deepcopy创建一个新对象,然后将每个对象从原始列表复制到该新对象中。切片执行与.copy相同的功能(浅表副本),后者创建一个新对象,但仅插入对原始列表对象的引用。参见https://docs.python.org/2/library/copy.html