今天在开发过程中遇到个小问题,需求是Python中遍历列表并在列表中添加字典,挺简单的一个需求,实现的时候出现了个小插曲,感觉挺有意思的,记录下,下面是一个非常直观的简化小示例
问题程序:
dict1={} list1=[] for va in range(5): dict1["num"]=va list1.append(dict1) print(list1)
但是运行的结果却是:
[{'num': 4}, {'num': 4}, {'num': 4}, {'num': 4}, {'num': 4}]
很明显,取值被最后一个传入的值4全部替换了.为什么会这样呢?
于是使用print(id(dict1)),查看内存信息,发现这个现象:
65511768 65511768 65511768 65511768 65511768
居然都是同一地址!!再查看list1中的每个元素地址:
for i in list1: print(id(list1)) 63193224 63193224 63193224 63193224 63193224
于是明白了,因为每次添加的都是同一个内存到list中去了,dict1每次写入的时候改变了内存中的value,但是地址不变,即只创建了一次内存空间,而只会不断的改变value了。
解决方法:每次遍历时候创建一个新的dict1
list1=[] for va in range(5): dict1 = {} dict1["num"]=va list1.append(dict1) print(list1)
执行结果:
[{u'num': 0}, {u'num': 1}, {u'num': 2}, {u'num': 3}, {u'num': 4}]