在阅读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的 struct 和内容完全隔离.

    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相关问答推荐

我从带有langchain的mongoDB中的vector serch获得一个空数组

将整组数组拆分为最小值与最大值之和的子数组

如何在箱形图中添加绘制线的传奇?

什么相当于pytorch中的numpy累积ufunc

如何在虚拟Python环境中运行Python程序?

通过pandas向每个非空单元格添加子字符串

python中的解释会在后台调用函数吗?

如何指定列数据类型

如何禁用FastAPI应用程序的Swagger UI autodoc中的application/json?

如何使用Numpy. stracards重新编写滚动和?

如何防止Pandas将索引标为周期?

如何使用使用来自其他列的值的公式更新一个rabrame列?

(Python/Pandas)基于列中非缺失值的子集DataFrame

在电影中向西北方向对齐""

如何用FFT确定频变幅值

Matplotlib中的曲线箭头样式

使用xlsxWriter在EXCEL中为数据帧的各行上色

ValueError:必须在Pandas 中生成聚合值

如何在Python中画一个只能在对角线内裁剪的圆?

如何将参数名作为参数传入到函数中?