Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python是否对列表的副本使用写时复制?_Python_Copy On Write - Fatal编程技术网

Python是否对列表的副本使用写时复制?

Python是否对列表的副本使用写时复制?,python,copy-on-write,Python,Copy On Write,假设复制现有列表: existing_list = [ 1, 2, 3 ]; copied_list = existing_list[:] ... copied_list[2] = 'a' // COW happens here [部分编辑] 我听说Python在复制的_列表或现有的_列表发生变异时使用写时复制。这是真的吗 在我看来,这是一个过度复杂的问题,需要到处锁定(想想多线程) 为了清楚起见:我不是在找一头牛。我只是想了解Python的标准行为。这不是“写时复制”,而是“现有引用在被

假设复制现有列表:

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

...

copied_list[2] = 'a' // COW happens here
[部分编辑]

我听说Python在复制的_列表或现有的_列表发生变异时使用写时复制。这是真的吗

在我看来,这是一个过度复杂的问题,需要到处锁定(想想多线程)


为了清楚起见:我不是在找一头牛。我只是想了解Python的标准行为。

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

大多数Python实现都使用锁定,而且它会破坏多线程(最新版本)。但是,我仍然不认为使用书面复制。它需要进一步的锁定和组织,这是一个相当低级别的优化,而且复制的成本比通常要小,因为所有东西都是一个引用(所以你只需要复制N个指针)


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

否。如果您希望列表实现具有写时复制,请尝试。

没有写时复制。当您运行
copied_list=existing_list[:]
时,将立即生成并填充一个新列表。来源如下:

您确定blist是写时复制的吗?它的文件没有提到这一点。乍一看,它看起来像一个简单的二叉搜索树,允许更快的插入,同时保留排序属性。