Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python dict中追加到数组将追加到所有数组_Python_Python 3.x_Dictionary - Fatal编程技术网

在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