Python对列表进行复制时是否使用写时拷贝?

5
假设我复制一个现有的列表:
existing_list = [ 1, 2, 3 ];
copied_list = existing_list[:]

...

copied_list[2] = 'a' // COW happens here

我听说当复制列表(copied_list)或原有列表(existing_list)发生改变时,Python使用写时复制技术。这是真的吗?

对我来说,这似乎是一种过于复杂的方式,需要在各个地方进行锁定(考虑多线程)。

为了明确:我不是在寻找写时复制的实现方法。我只是想了解Python的标准行为。

4个回答

9

我想知道为什么人们总是说切片列表会给你一个对同一列表的引用,就像一个窗口一样。 - bokunodev
很可能的原因是,在其他一些语言中,切片确实共享底层数据,所以人们可能会认为Python也是如此,但他们实际上并没有检查。或者这只是一厢情愿的想法。 - Raymond Hettinger

2
这不是“写时复制”,而是“现有引用继续存在直到被替换”。这里没有什么可看的,继续前进。

2
大多数Python实现都在各个地方使用锁,这会破坏多线程(GIL)。但是,我认为并没有使用写时复制。它需要进一步的锁定和组织,这是一种相当低级别的优化,而且由于所有内容都是引用(所以只需复制N个指针),所以复制的成本将比通常情况下更小。
如果你足够关心,可以查看源代码。我没有分析可能进行复制的所有方法,但快速搜索(“copy”,“write”,“lock”)没有发现任何指示COW或类似机制的内容。

2

不行。如果你想要一个带有写时复制功能的列表实现,请尝试使用blist


1
你确定blist是写时复制吗?它的文档没有提到这一点。乍一看,它看起来只是一个简单的二叉搜索树,以允许更快的插入同时保持排序属性。 - max

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接