首页 > 解决方案 > 浅拷贝如何与 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

标签: python

解决方案


让我们看看你原来的字典。它由两个级别的集合组成:

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

推荐阅读