为什么在python中执行添加操作后列出产品重复元素

时间:2019-07-23 02:26:03

标签: python list

这确实是一个难题,在调试代码时,我发现了一个非常奇怪的错误(它在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'}]

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循环中。