2

假设我复制一个现有列表:

existing_list = [ 1, 2, 3 ];
copied_list = existing_list[:]

...

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

[一些编辑]

我听说当copyed_list 或existing_list 发生突变时,Python 使用写时复制。这是真的?

在我看来,这似乎是一个过于复杂的问题,需要在所有地方进行锁定(想想多线程)。

为了清楚起见:我不是在寻找 COW impl。我只是想了解什么是 Python 标准行为。

4

4 回答 4

6

There is no copy-on-write. When you run copied_list = existing_list[:], a new list is built and populated immediately. Here is the source: http://hg.python.org/cpython/file/2.7/Objects/listobject.c#l467

于 2011-11-02T15:04:34.847 回答
2

这不是“写时复制”,这是“现有引用继续存在直到被替换”。这里没什么好看的,离开。

于 2011-11-02T13:42:52.243 回答
2

无论如何,大多数 Python 实现都在各处使用锁定,并且无论如何它都会破坏多线程(GIL)。但是,我不认为使用写时复制。它需要进一步的锁定和组织,这是一个相当低级的优化,并且复制的成本将比平时小,因为一切都是引用(所以你只需复制 N 个指针)。

如果您足够关心,您可以阅读源代码。我没有剖析所有可能复制的方法,但是快速搜索(“复制”、“写入”、“锁定”)没有找到任何表明 COW 或类似机制的东西。

于 2011-11-02T13:44:46.570 回答
1

不,如果您想要使用写时复制的列表实现,请尝试blist

于 2011-11-02T13:45:12.440 回答