【问题标题】:How to overwrite values in a Python dictonary?如何覆盖 Python 字典中的值?
【发布时间】:2021-01-14 01:20:34
【问题描述】:

我有这个例子:

    d = {}
    x = {'key1': 'value1', 'key2': 'value2'}
    above = ['abovekey1', 'abovekey2']

    for ak in above:
        d[ak] = x
        d[ak]['key2'] = str(ak)

d的输出是:

{'abovekey1': {'key1': 'value1', 'key2': 'abovekey2'},
 'abovekey2': {'key1': 'value1', 'key2': 'abovekey2'}}

但我编写的代码期望得到这个输出:

{'abovekey1': {'key1': 'value1', 'key2': 'abovekey1'},
 'abovekey2': {'key1': 'value1', 'key2': 'abovekey2'}}

如何更改代码以产生我期望的输出以及在上面的示例中我缺少什么?

谢谢大家!

【问题讨论】:

  • 您在d 中添加了对x 的多个引用。如果你想让它们不同,你想复制x,就像你把它放在d中一样。

标签: python dictionary


【解决方案1】:

如 cmets 中所述,d[ak] = x 引用同一个字典。您可以通过复制x来达到预期的效果:

x = {'key1': 'value1', 'key2': 'value2'}
above = ['abovekey1', 'abovekey2']

d = {k: dict(x, key2=k)  for k in above}
print(d)

打印:

{'abovekey1': {'key1': 'value1', 'key2': 'abovekey1'}, 'abovekey2': {'key1': 'value1', 'key2': 'abovekey2'}}

【讨论】:

    【解决方案2】:

    你需要复制x使用.copy

    例如:

    d = {}
    x = {'key1': 'value1', 'key2': 'value2'}
    above = ['abovekey1', 'abovekey2']
    
    for ak in above:
        d[ak] = x.copy()
        d[ak]['key2'] = ak
        
    print(d)
    

    输出:

    {'abovekey1': {'key1': 'value1', 'key2': 'abovekey1'},
     'abovekey2': {'key1': 'value1', 'key2': 'abovekey2'}}
    

    【讨论】:

    【解决方案3】:

    在 python 中,对象永远不会被隐式复制,而是被引用。如果要编辑单独的字典,则需要先将其复制。

    注意:.copy() 操作会生成字典的浅拷贝。如果您的字典有更多层次结构级别/嵌套字典,并且您想复制所有这些,则需要使用.deepcopy() 进行深度复制。为此,您需要先导入它

    from copy import deepcopy
    

    有关浅拷贝和深拷贝的更多信息,请参阅 https://docs.python.org/3/library/copy.html

    【讨论】:

      猜你喜欢
      • 2012-08-10
      • 1970-01-01
      • 1970-01-01
      • 2011-06-18
      • 1970-01-01
      • 2015-05-03
      • 2011-01-02
      • 2018-02-05
      • 1970-01-01
      相关资源
      最近更新 更多