为什么更新“浅”复制字典不会更新“原始”字典? [复制]

2023-12-15

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

m.copy() 方法使浅 a 中包含的项目的副本 映射对象并将它们放置在 新的映射对象。

考虑一下:

>>> 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()没有像我预期的那样工作?或者我对浅复制和深复制的理解有缺陷?


“浅复制”是指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]})

So:

  1. b = a:参考作业,制作a and b指向同一个对象。

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

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

    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):深度复制,a and b的结构和内容变得完全孤立。

    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]'.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么更新“浅”复制字典不会更新“原始”字典? [复制] 的相关文章

随机推荐

  • 如何在 spring bean 中获取 HttpServletRequest?

    我正在开发一个具有基于 Flex 的前端和 Spring Hibernate 后端的应用程序 为了让 Facebook 集成按照我目前的方式工作 我需要在后端读取前端 javascript 中设置的 cookie 并在登录期间进行一些验证
  • 如何在函数运行期间忽略所有用户输入?

    我有一个 Python 模块 它使用 pynput 侦听组合键 然后 一旦按下它 它就会在文本程序中键入一个字符串 效果很好 除了 在下面的示例中 用户的组合键设置为 shift space 这很有意义 并且可能是运行我的程序的 Windo
  • 我可以像 Joe Belfiore 一样在 Windows Phone 7 上使用“演示者模式”来进行应用程序演示吗?

    我希望能够在手机 电脑屏幕或投影仪上显示发生的情况 这似乎是可能的 因为微软在他们所有的演示中都做到了这一点 但我似乎不知道如何做到 例如 我构建了一个应用程序 我想向一屋子的潜在客户演示它 在演示过程中我不能很好地使用模拟器 我希望房间里
  • 从 PHP 插入时在 MongoDB 上执行 JS

    使用 mongo shell 时 我可以运行如下命令 db sandbox insert line db eval storedFunction or db sandbox insert line function return 1337
  • 如何使用 render(:update) 和 Replace_html 重新加载 div?

    如何仅重新加载页面上的 div id 我只需要重新加载某个div 在我的控制器中我有 def mycontrolleraction render update do page reload only the div adiv control
  • C++中删除指针

    背景 我正在努力理解指针 几周前我们在学校才看到它们 今天练习时我遇到了一个愚蠢的 问题 这对你来说可能非常简单 但我几乎没有编程经验 我在 SO 中看到了很多关于删除指针的问题 但它们似乎都与删除类而不是 简单 指针 或任何正确的术语 有
  • JavaScript - 通过 JavaScript 访问网络选项卡 [重复]

    这个问题在这里已经有答案了 我需要访问 例如 Chrome 开发者工具网络选项卡JavaScript 我只需要 1 源名称 第 1 列 和2 类型 第 3 列 但我完全不知道该怎么做 非常感谢链接 提前致谢 我做了一些研究 但似乎你做不到
  • 列表视图中的居中文本

    我发现不可能将文本在列表视图中居中 尝试在几乎所有内容上尝试wrapp content和layout gravity center 但文本不会移动 这是我的班级代理Eco package com blabla import java tex
  • 如何通过void指针访问成员

    首先尝试编写一个小程序将基本算术翻译成英语 最后我构建了一个二叉树 这不可避免地非常不平衡 来表示求值的顺序 首先 我写了 struct expr typedef struct unsigned char entity flag posit
  • 通过ObjectOutputStream发送文件然后用Java保存它?

    我有这个简单的服务器 客户端应用程序 我试图让服务器通过 OutputStream FileOutputStream OutputStream ObjectOutputStream 等 发送文件 并在将其保存到实际文件之前在客户端接收它 问
  • 'this' 绑定到订阅函数而不是 Angular2 中的外部组件范围

    我在 Angular2 中的一个组件中遇到了问题 因为 this 在我的组件之一中绑定到了错误的上下文 我有其他组件没有发生此问题 但我看不出有什么区别 这是我的代码 成分 import Component Input from angul
  • python闭包中的cell_contents

    python 中的 cell contents 对闭包的调用是否发生了变化 我知道 func closure 不起作用并且 closure works func closure cell contents Traceback most re
  • 带有逻辑或的 IF 语句[重复]

    这个问题在这里已经有答案了 if 1 2 4 cout lt lt True else cout lt lt False 我就是这样读到上面的内容的 如果 1 等于 2 或 4 则打印 true 否则 打印 false 当执行此操作时 tr
  • Hadoop 2.4 无法执行目标 org.apache.maven.plugins:maven-antrun-plugin:1.7

    我正在尝试从源代码安装 Hadoop 2 4 0 出现以下错误 我用 google 搜索但找不到任何解决方案 请帮忙 Regards 操作系统 Ubuntu 12 04 64 位 Java java版本 1 6 0 45 协议 版本 lib
  • Django ORM - 具有不同选择子句的分组聚合

    假设我们有 Django ORM 模型Meetup具有以下定义 class Meetup models Model language models CharField speaker models CharField date models
  • 如何在 MISRAC:2012 中创建遵循 Dir 4.12 和 4.8 的模块?

    此问题涉及遵循 MISRAC 2012 指南的 ISO C99 编码 我正在寻找有关 Dir 4 8 如果指向结构或联合的指针在翻译单元内从未取消引用 则应隐藏对象的实现 以及 Dir 4 12 不应使用动态内存分配 的指导 在 C 中实现
  • 如何使用 ImageMagick 将 SVG 转换为 PNG?

    我有一个定义大小为 16x16 的 SVG 文件 当我使用 ImageMagick 的转换程序将其转换为 PNG 时 我得到一个 16x16 像素的 PNG 它太小了 convert test svg test png 我需要指定输出 PN
  • 如何使自定义状态discord.py

    为什么我的代码不起作用 bot event async def on ready print Bot is now working await bot change presence activity discord CustomActiv
  • 数据库字段中的枚举存储

    最好存储枚举value或枚举name在数据库表字段中 例如 我应该将 TJLeft 存储为字符串还是数据库中的等效值 Public Enum TextJustification TJLeft TJCenter TJRight End Enu
  • 为什么更新“浅”复制字典不会更新“原始”字典? [复制]

    这个问题在这里已经有答案了 在阅读文档时dict copy 它说它制作了字典的浅表副本 我正在关注的书 Beazley s Python Reference 也是如此 书中写道 m copy 方法使浅 a 中包含的项目的副本 映射对象并将它