这让我很沮丧。这是我的代码的非常简化的版本,但显示出确切的问题:
test={"number":"0"}
testarray=[test]
print(testarray)
for x in range(5):
test["number"] = x
print(test)
testarray.append(test)
print("TestArray")
for x in testarray:
print(x)
输出为:
[{'number': '0'}]
{'number': 0}
{'number': 1}
{'number': 2}
{'number': 3}
{'number': 4}
TestArray
{'number': 4}
{'number': 4}
{'number': 4}
{'number': 4}
{'number': 4}
{'number': 4}
为什么所有条目都设置为字典的最后一个值?我也尝试过testarray.insert(len(testarray),test)
,但结果相同。
答案 0 :(得分:3)
我认为您在列表中多次输入了相同的字典。每次在同一字典中更改数字,列表就会存储对该字典的引用。
testarray = []
for i in range(5):
test = {"number": i}
testarry.append(test)
答案 1 :(得分:0)
test={"number":"0"}
此行创建一个新字典对象,该对象具有与值"number"
关联的键"0"
。它还在本地范围内创建名称test
,并将该名称与字典对象相关联。
稍后在代码中您将有此行
test["number"] = x
将使用名称test
所引用的对象(在本例中为在前一行创建的字典),更新与该对象内的键"number"
相关的值以引用相同的对象对象x
所指(在这种情况下,数字为0、1、2、3和4)。
testarray.append(test)
此行将对该字典的引用添加到名称testarray
所引用的数组的末尾。由于它每次都会向同一词典添加引用,因此对该词典的任何更改都会反映在所有引用中。
要查看同一错误的简单示例,请尝试以下代码:
foo = {'x': 0}
bar = [foo, foo, foo]
foo['x'] = 1
print(bar)
为修正您的代码,我建议:
testarray = []
for x in range(5):
testarray.append({"number": x})
或更惯用的
testarray = [ {"number": x} for x in range(5) ]