在阅读dict.copy()年的文档时,它说它只是简单地复制了这本字典.我下面的书(比兹利的Python参考)也是如此,书中说:

m.copy()方法使

考虑一下:

>>> original = dict(a=1, b=2)
>>> new = original.copy()
>>> new.update({'c': 3})
>>> original
{'a': 1, 'b': 2}
>>> new
{'a': 1, 'c': 3, 'b': 2}

所以我假设这会更新original的值(并加上'c':3),因为我正在做一个浅拷贝.比如,如果你只是为了一张 list :

>>> original = [1, 2, 3]
>>> new = original
>>> new.append(4)
>>> new, original
([1, 2, 3, 4], [1, 2, 3, 4])

这是意料之中的事.

既然这两个都是浅拷贝,为什么dict.copy()不能像我预期的那样工作呢?还是我对浅抄和深抄的理解是有缺陷的?

推荐答案

"浅复制"意味着字典的content不是按值复制的,而是创建一个新的引用.

>>> a = {1: [1,2,3]}
>>> b = a.copy()
>>> a, b
({1: [1, 2, 3]}, {1: [1, 2, 3]})
>>> a[1].append(4)
>>> a, b
({1: [1, 2, 3, 4]}, {1: [1, 2, 3, 4]})

相比之下,深度复制将按值复制所有内容.

>>> import copy
>>> c = copy.deepcopy(a)
>>> a, c
({1: [1, 2, 3, 4]}, {1: [1, 2, 3, 4]})
>>> a[1].append(5)
>>> a, c
({1: [1, 2, 3, 4, 5]}, {1: [1, 2, 3, 4]})

因此:

  1. b = a:参考赋值,使ab点指向同一对象.

    Illustration of 'a = b': 'a' and 'b' both point to '{1: L}', 'L' points to '[1, 2, 3]'.

  2. b = a.copy():浅复制,ab将成为两个孤立的对象,但它们的内容仍然共享相同的引用

    Illustration of 'b = a.copy()': 'a' points to '{1: L}', 'b' points to '{1: M}', 'L' and 'M' both point to '[1, 2, 3]'.

  3. b = copy.deepcopy(a):深度复制,ab的结构和内容完全隔离.

    Illustration of 'b = copy.deepcopy(a)': 'a' points to '{1: L}', 'L' points to '[1, 2, 3]'; 'b' points to '{1: M}', 'M' points to a different instance of '[1, 2, 3]'.

Python相关问答推荐

从文本文件创建字典列表

如何使用 Lambda 赋予 HTTP API 或 REST API 不更新的能力?

使用 make_axes_locatable 时如何删除 matplotlib 子图中的填充

组合数组的相似元素

带有过滤条件的Pandas 滚动窗口以删除一些最新数据

我通过postman 获得状态代码 200,但通过 request.get 我获得状态代码 500

我在其中 1 列中有一个带有 json 子字符串的数据框.我想提取变量并为它们制作列

如何在不同的子图中绘制对,侧面有差异

使用 psycopg3 跨服务器复制表

如何将一列的所有项目移动到Pandas 中的列?

如何将列中的项目变为多列?

使用 Python 或 Curl 下载 json 文件不起作用

如何使用 Python reduce 或列表推导将函数列表顺序应用于字符串?

'str' 对象没有属性 'apply' 与 sklearn

根据条件创建虚拟 DataFrame

是否有更好的正则表达式来计算中文字母的数量并同时排除一些字符?

Pandas df 按计数元素分组

在 __next__() 中修改之前返回对象

为什么 `any` 和 `all` 似乎没有在这里使用短路判断?

如何将过滤的分组聚合的结果分配为原始 Pandas DataFrame 中的新列