追加字典数组

时间:2020-08-07 21:09:41

标签: python

这让我很沮丧。这是我的代码的非常简化的版本,但显示出确切的问题:

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),但结果相同。

2 个答案:

答案 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) ]