python - 浅拷贝如何与 Python 中的字典中的字典一起使用?
问题描述
当我编写与深拷贝具有相似功能的函数时,我遇到了困难
recipes = {
"Butter chicken": {
"chicken": 750,
"lemon": 1,
"cumin": 1,
"paprika": 1,
"chilli powder": 2,
"yogurt": 250,
"oil": 50,
"onion": 1,
"garlic": 2,
"ginger": 3 }
}
recipes_copy = {}
for char, value in recipes.items():
char_copy = char
value_copy = value.copy()
recipes_copy[char_copy] = value_copy
recipes_copy["Butter chicken"]["ginger"] = 300
print(recipes_copy["Butter chicken"]["ginger"])
print(recipes["Butter chicken"]["ginger"])
我不明白为什么value_copy = value.copy()
当我更改复制字典的值时,行中的浅拷贝不会改变值recipes_copy["Butter chicken"]["ginger"] = 300
我得到的输出:
300
3
解决方案
让我们看看你原来的字典。它由两个级别的集合组成:
first level: dictionary (keys: Butter chicken)
second level: dictionary (keys: chicken, lemon, ginger, etc)
第二级的值是数字。复制它们没有必要(也没有效果)。数字不包含更多值。
在您的代码中,您遍历集合的第一级(仅包含键“Butter chicken”的字典)。为每个二级字典创建一个浅拷贝。但是,对于第二级,深拷贝和浅拷贝之间没有区别,因为第二级字典不包含可以复制的进一步集合,只是数字。
您可以通过迭代并复制它的值来有效地创建第一级字典的副本。您对二级字典执行相同的操作。因为您复制了所有内容,所以原始字典和副本之间没有链接。因此,您对副本所做的更改不会传播回来。
如果你浅拷贝一级字典,你会得到你期望的行为:
recipes = {
"Butter chicken": {
"chicken": 750,
"lemon": 1,
# I took the freedom to shorten your recipe a bit :)
"ginger": 3 }
}
print(recipes["Butter chicken"]["ginger"]) # prints 3
recipes_copy = recipes.copy()
recipes_copy["Butter chicken"]["ginger"] = 300
print(recipes_copy["Butter chicken"]["ginger"]) # prints 300
print(recipes["Butter chicken"]["ginger"]) # prints 300
推荐阅读
- kubernetes - 如何在 Kiali 图中隐藏来自 kube-probe 的流量?
- r - 如何从特定列中删除(或用 NA 替换)给定值的数据?
- c# - unity3d 中的 Kafka 集成引发 Win32Exception 错误
- react-redux - React Router V4 - 组件不渲染
- api - 使用 Adsense API 在 AdMob 中访问广告系列报告
- function - 我怎样才能使这个功能更优雅
- google-sheets - ArrayFormula() 和 SumIf() 匹配 "This" Row()
- elasticsearch - 6.5.1 和 5.6.2 之间不稳定的跨集群搜索
- coq - Coq 中模块参数的特化
- amazon-web-services - 如何让 ec2 上的 nginx 与 https 一起工作