gpt4 book ai didi

python - 理解 dict.copy() - 浅的还是深的?

转载 作者:IT老高 更新时间:2023-10-28 12:04:37 24 4
gpt4 key购买 nike

在阅读 dict.copy() 的文档时,它说它制作了字典的浅拷贝。我正在关注的书(Beazley's Python Reference)也是如此,它说:

The m.copy() method makes a shallow copy of the items contained in a mapping object and places them in a new mapping object.

考虑一下:

>>> 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),因为我正在做一个浅拷贝。就像您为列表做的一样:

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

这按预期工作。

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

最佳答案

“浅拷贝”是指字典的内容不是按值拷贝,而是创建一个新的引用。

>>> 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 - 理解 dict.copy() - 浅的还是深的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3975376/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com