Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.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:一个结构的所有元素都会发生变化_Python_Arrays_List_Mutability - Fatal编程技术网

Python:一个结构的所有元素都会发生变化

Python:一个结构的所有元素都会发生变化,python,arrays,list,mutability,Python,Arrays,List,Mutability,我不明白为什么会发生以下情况。Python 2.7.2 parinfo = [{'limited':[0,0], 'limits':[0.,0.]}] * 3 parinfo[2]['limited'][0] = 1 parinfo[2]['limited'][0] = 1 parinfo [{'limited': [1, 0], 'limits': [0.0, 0.0]}, {'limited': [1, 0], 'limits': [0.0, 0.0]}, {'limited': [1

我不明白为什么会发生以下情况。Python 2.7.2

parinfo = [{'limited':[0,0], 'limits':[0.,0.]}] * 3 
parinfo[2]['limited'][0] = 1
parinfo[2]['limited'][0] = 1

parinfo 
[{'limited': [1, 0], 'limits': [0.0, 0.0]},
{'limited': [1, 0], 'limits': [0.0, 0.0]},
{'limited': [1, 0], 'limits': [0.0, 0.0]}]
在第行上方,它创建了一个字典对象,而不是创建3个不同的字典对象;列表中的所有项都引用同一个词典

您需要以这种方式创建3个单独的词典:

parinfo = [{'limited':[0,0], 'limits':[0.,0.]} for i in range(3)]

这段代码创建的是浅拷贝而不是深拷贝。

您的问题可以分解为几个部分

首先,您要将一个列表相乘,它利用了uuu mul_uuu()魔术方法。

>>> dicty['l'][0] = 100
>>> dicty
{'l': [100, 2, 3]}
s.uu mul(n)->导致s*n——重复连接

 >>> a = [1,2,3]
 >>> a * 3
 [1, 2, 3, 1, 2, 3, 1, 2, 3]
此外,尝试初始化列表列表将导致引用三个内部列表的列表,这可能不是您想要的

>>> a = [[]]
>>> a * 3
[[], [], []]
其次,您已经创建了一个键值对,其中的值是一个列表。

>>> dicty['l'][0] = 100
>>> dicty
{'l': [100, 2, 3]}
“有限”是包含三个元素的列表的关键[1,2,3]

>>> dicty = {'limited': [1, 2, 3]}
>>> dicty['limited']
[1, 2, 3]
第三,您实际上是在更新列表中的第0个元素。

>>> dicty['l'][0] = 100
>>> dicty
{'l': [100, 2, 3]}

@StevenRumbalski,谢谢你的评论。我也相应地更新了。没有,甚至连一个浅显的副本都没有。仅对同一dictionary对象的3个引用。有关浅拷贝(以及深拷贝)的解释,请参见本文。