在python dict中追加到数组将追加到所有数组
我有以下代码:在python dict中追加到数组将追加到所有数组,python,python-3.x,dictionary,Python,Python 3.x,Dictionary,我有以下代码: a_dict = dict.fromkeys(['a', 'b', 'c'], []) a_dict['a'].append(1) print(a_dict) 哪个输出 `{'a': [1], 'c': [1], 'b': [1]}` 为什么将1附加到所有数组中,而不仅仅是带有键a的数组?如果我只想附加到带有键a,我该怎么做?Aha,似乎是dict.fromkeys只生成一个值的副本,并返回指向它的指针。如果它被初始化为a_dict={'a':[],'b':[]
a_dict = dict.fromkeys(['a', 'b', 'c'], [])
a_dict['a'].append(1)
print(a_dict)
哪个输出
`{'a': [1], 'c': [1], 'b': [1]}`
为什么将1附加到所有数组中,而不仅仅是带有键
a
的数组?如果我只想附加到带有键a
,我该怎么做?Aha,似乎是dict.fromkeys只生成一个值的副本,并返回指向它的指针。如果它被初始化为a_dict={'a':[],'b':[],'c':[]},那么代码将按预期工作
在已知的情况下,在
答案是:然而,另一个dict={key:[]for key in['a',b',c']}fromkeys()方法返回一个新字典,其中给定的元素序列作为字典的键 如果设置了value参数,则新创建的字典的每个元素都将设置为提供的值 如果提供的值是一个可变对象(其值可以修改),如list、dictionary等,那么在修改可变对象时,序列的每个元素也会更新 这是因为,每个元素都指定了对同一对象的引用(指向内存中的同一对象) 这将创建一个包含键“a”、“b”、“c”的字典,每个键的值为
[]
这里的问题是每个关键点指向相同的值:内存中相同的空dict实例[]
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']
并不是一个真正的解释(实际上是你给出的)。但这解决了问题-a_dict['a']=1
你对此有任何参考资料或链接可以阅读更多吗?我查了一下地图,在地图上找不到任何东西this@K.J.Phan是的,您可以在@K.J.Phan中阅读更多内容。一般来说,Python就是这样工作的。这些东西不是被暗中复制的。是的,谢谢!我只是对较低级别的设计感到好奇,看了一下,发现dict_fromkeys(PyObject*cls,PyObject*args)
的实现确实使用指针将值插入到键中:insertdict(mp,key,hash,value)
,其中PyObject*value=Py\u None代码>(默认为无)-至少我认为这就是它的意思,哈哈
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