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

时间:2017-02-20 00:24:49

标签: 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, 0], 'limits': [0.0, 0.0]}]

3 个答案:

答案 0 :(得分:2)

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

在上面,它不是创建3个不同的字典对象,而是创建一个;列表中的所有项目都引用相同的字典。

您需要这样做才能创建3个单独的词典:

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

答案 1 :(得分:2)

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

首先,您将列出一个利用__mul __()魔术方法的列表。

s .__ mul __(n) - >导致s * n - 重复连接。

 >>> a = [1,2,3]
 >>> a * 3
 [1, 2, 3, 1, 2, 3, 1, 2, 3]

此外,尝试初始化列表列表将导致列表引用三个内部列表,这可能不是您想要的。

>>> a = [[]]
>>> a * 3
[[], [], []]

其次,您创建了一个键值对,其值为列表。

“limited”是具有三个元素[1,2,3]

的列表的关键
>>> dicty = {'limited': [1, 2, 3]}
>>> dicty['limited']
[1, 2, 3]

第三,您实质上是在更新列表中的第0个元素。

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

答案 2 :(得分:-1)

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

此代码创建浅拷贝而不是深拷贝。