这确实是一个难题,在调试代码时,我发现了一个非常奇怪的错误(它在python 3.6和3.7中都发生过,未在其他代码上进行测试)
当我遍历一个简单列表时,取出元素并分配给字典,创建字典的新列表。
list.append不仅添加了新元素,而且还替换了先前的元素。
简单的python代码:
d1 = {}
l1=["A1,1","B2,2"]
l2 =[]
for rows in l1:
print("----- l2 before append")
print(l2)
d1["ID"]=rows
print("-------dict to append ")
print(d1)
l2.append(d1)
print("----- l2 after append")
print(l2)
打印结果:
----- l2 before append
[]
-------dict to append
{'ID': 'A1,1'}
----- l2 after append
[{'ID': 'A1,1'}]
----- l2 before append
[{'ID': 'A1,1'}]
-------dict to append
{'ID': 'B2,2'}
----- l2 after append
[{'ID': 'B2,2'}, {'ID': 'B2,2'}]
我希望l2的输出为[{'ID':'A1,1'},{'ID':'B2,2'}] 但我得到了[{'ID':'B2,2'},{'ID':'B2,2'}]
答案 0 :(得分:1)
l1=["A1,1","B2,2"]
l2 =[]
for rows in l1:
d1 = {}
#print(id(d1))
# you will find it's a different object each time.
d1["ID"]=rows
l2.append(d1)
print(l2)
或者您可以按照以下方式进行操作
l1=["A1,1","B2,2"]
l2 = [{"ID":i } for i in l1]
print(l2)
输出为
[{'ID': 'A1,1'}, {'ID': 'B2,2'}]
答案 1 :(得分:0)
字典只能包含唯一键,因此'ID'
被新值覆盖。
您的列表实际上包含字典d1
的值,如果d1
发生变化,则您的列表将发生变化。
您使用的是全局字典,并且值随着第二次for循环传递而变化,为了获得预期的结果,请将d1 = {}
放入for循环中。