Python 列表复制使用写时复制吗?

5 投票
4 回答
3195 浏览
提问于 2025-04-17 05:29

假设我复制了一个已有的列表:

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

...

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

[一些修改]

我听说当复制的列表或原来的列表被修改时,Python会使用“写时复制”(copy-on-write)技术。这是真的吗?

我觉得这听起来有点复杂,感觉需要到处加锁(想想多线程的情况)。

为了更清楚:我并不是在寻找“写时复制”的实现。我只是想了解Python的标准行为是什么。

4 个回答

2

这不是“写时复制”,而是“现有的引用会一直存在,直到被替换”。没什么好看的,继续往前走吧。

2

不行。如果你想要一个支持写时复制的列表实现,可以试试blist

9

没有所谓的“写时复制”。当你运行 copied_list = existing_list[:] 这行代码时,实际上是立刻创建了一个新的列表,并把原来的列表内容复制到这个新列表里。你可以在这里查看具体的代码来源: http://hg.python.org/cpython/file/2.7/Objects/listobject.c#l467

撰写回答