当前位置: 首页 > 面试题库 >

Python-了解dict.copy()-浅还是深?

许黎明
2023-03-14
问题内容

在阅读的文档时dict.copy(),它说它是字典的浅表副本。我关注的书(Beazley的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)的值,因为我正在执行浅表复制。就像你对列表进行操作一样:

>>> 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:参考分配,制造a并b指向同一对象。

‘a = b’的图示:’a’和’b’都指向’{1:L}’,’L’指向’[1、2、3]。

  1. b = a.copy():浅拷贝,a并且b将成为两个独立的对象,但其内容仍共享相同的参考

‘b = a.copy()’的图示:’a’指向’{1:L}’,’b’指向’{1:M}’,’L’和’M’都指向’[ 1,2,3]”。

  1. b = copy.deepcopy(a):深度复制,a并且b的结构和内容变得完全孤立。

‘b = copy.deepcopy(a)’的图示:’a’指向’{1:L}’,’L’指向’[1、2、3]’; ‘b’指向’{1:M}’,’M’指向’[1,2,3]’的另一个实例。



 类似资料:
  • 描述 (Description) 方法copy()返回字典的浅表副本。 语法 (Syntax) 以下是copy()方法的语法 - dict.copy() 参数 (Parameters) NA 返回值 (Return Value) 此方法返回字典的浅表副本。 例子 (Example) 以下示例显示了copy()方法的用法。 #!/usr/bin/python dict1 = {'Name': 'Z

  • 本文向大家介绍浅谈onTouch先执行,还是onClick执行(详解),包括了浅谈onTouch先执行,还是onClick执行(详解)的使用技巧和注意事项,需要的朋友参考一下 有一个Button 按钮,要想为该按钮设置onClick事件和OnTouch事件 此时,我们现在分析一下,是onTouch先执行,还是onClick执行,接下来我从FrameWork 源码去探寻一下整个事件的执行流程和原理:

  • 问题内容: 似乎对此产生了很多困惑和不同意见([1]和其他来源),究竟会产生深拷贝还是浅拷贝。 该测试表明该副本很深: 该测试表明该副本较浅: 解决方案是否仅是制作顶层维度的深层副本,而其他维度是浅层副本?真相是什么? 问题答案: 它产生一个浅表副本,即一个包含“旧”引用的 新 数组(指向相同的对象,这些对象没有被复制)。 特别是,如果您有嵌套数组,则不会复制这些数组。您将得到一个新数组,其“顶级

  • 问题内容: PHP是编译还是解释? 问题答案: PHP是一种解释型语言。可以解释PHP的二进制文件已编译,但是您编写的文件却被解释。

  • 本文向大家介绍详解python函数传参是传值还是传引用,包括了详解python函数传参是传值还是传引用的使用技巧和注意事项,需要的朋友参考一下 首先还是应该科普下函数参数传递机制,传值和传引用是什么意思? 函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题。基本的参数传递机制有两种:值传递和引用传递。 值传递(passl-by-value)过程中,被调

  • 问题内容: 在pandas库中多次出现改变就地等物体的方式与下面的语句一个选项… 我很好奇返回的内容以及何时传递对象与何时传递对象。 所有操作self何时都在修改?何时立即创建一个新对象,例如然后返回? 问题答案: 如果通过,该数据被重命名到位(它没有返回值),所以你会使用: 当传递(这是默认值,所以没有必要),执行操作,并返回该对象的副本,所以你会使用: