我不明白为什么会发生以下情况。 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]}]
答案 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
此代码创建浅拷贝而不是深拷贝。