【问题标题】:Appending to array in python dict appends to all arrays [duplicate]追加到python dict中的数组追加到所有数组[重复]
【发布时间】:2017-01-25 08:40:33
【问题描述】:

我有以下代码:

a_dict = dict.fromkeys(['a', 'b', 'c'], [])  
a_dict['a'].append(1)  
print(a_dict)  

哪个输出

`{'a': [1], 'c': [1], 'b': [1]}` 

为什么在所有数组中都添加了 1 而不是只添加了一个键为 a 的数组?如果我只想附加到带有密钥a 的那个,我该怎么做?

【问题讨论】:

  • 不是一个真正的解释,(你实际上给出了。)但这解决了问题 - a_dict['a'] = 1

标签: python python-3.x dictionary


【解决方案1】:

fromkeys() 方法返回一个以给定元素序列作为字典键的新字典。

如果设置了 value 参数,则新创建的字典的每个元素都设置为提供的值。

如果提供的值是可变对象(其值可以修改),如列表、字典等,当可变对象被修改时,序列的每个元素也会更新。

这是因为,每个元素都被分配了一个对同一个对象的引用(指向内存中的同一个对象)。

【讨论】:

  • 你有这方面的参考资料,或者链接来阅读更多关于这方面的内容吗?我检查了documentation 并在此找不到任何内容
  • @K.J.Phan 是的,你可以在here阅读更多内容
  • @K.J.Phan 一般来说,这就是 Python 的工作方式。事物不会被隐式复制。
  • 好的,谢谢!只是对设计的较低级别感到好奇,查看了source 并看到dict_fromkeys(PyObject *cls, PyObject *args) 的实现确实使用指针将值插入到键中:insertdict(mp, key, hash, value),其中PyObject *value = Py_None;(默认到无)-至少我认为这就是这个意思哈哈
【解决方案2】:

啊哈,似乎 dict.fromkeys 只复制一个值,并返回一个指向它的指针。如果它被初始化为 a_dict={'a': [], 'b': [], 'c': []} 那么代码按预期工作。

知道了,在dict.fromkeys all point to same list找到了一个重复项

那里建议的答案:
yet_another_dict = {key: [] for key in ['a', 'b', 'c']}

【讨论】:

    【解决方案3】:
    a_dict = dict.fromkeys(['a', 'b', 'c'], [])
    

    这将创建一个包含键“a”、“b”、“c”的字典,每个键的值 []

    这里的问题是每个键都指向相同的值:内存中相同的空字典实例[]

    a_dict['a']a_dict['b'] 不仅相等(评估相等),它们是完全相同的实例。您创建的字典有三个键,每个键的值都是指向同一个空字典实例的指针。

    你可以检查一下:

    a_dict['a'] == a_dict['b']
    # Returns True: both are equal
    a_dict['a'] is a_dict['b']
    # Also returns True: both are the same instance
    

    因此,修改a_dict['a'] 会修改共享的dict 实例并影响a_dict['b']

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-21
      • 2015-02-21
      • 2021-11-02
      • 2017-11-06
      • 2016-12-03
      • 1970-01-01
      • 2015-03-27
      • 2016-08-23
      相关资源
      最近更新 更多