dd = {} #字典
ll = [] #列表
dd['no']=1001 #给字典赋值
ll.append(dd)
dd['no'] =1002 # 将修改后的新字典添加到列表
ll.append(dd)
#输出查看数据信息:
print(ll)
print(id(ll),id(ll[0]),id(ll[1]))
原因:
Python字典列表中的每一项,存储的是各个字典的引用,而不是一份独立的对象拷贝。 因此每次向字典列表中添加新的字典时,需要用一个新的字典对象,而不能通过修改原有对象的内容来实现。
解决:
有两种方法: 1.在循环里字典初始化,每次for循环都将字典初始化,再添加数据,就不会被覆盖。(每次字典重新开辟内存空间,并使变量dict指向该空间,因此不会出现相同地址的问题) 2.每次为列表添加数据的时候,在内存中其他位置创建与该字典相同的数据并加入列表(若字典内包含列表,需要使用copy()或deepcopy())
# 解决一:使用copy() 或者 deepcopy()
ll2 = []
dd['no'] = 1001 # 给字典赋值
ll2.append(dd.copy())
dd['no'] = 1002 # 给字典赋值
ll2.append(dd.copy())
print(ll2)
# 解决二:使用循环都将字典初始化
ll2=[]
#循环
for i in range(1001,1003):
dd2={}
dd2['no'] = i # 给字典赋值
ll2.append(dd2)
print(ll2)
print(id(ll2), id(ll2[0]), id(ll2[1]))