Python 在列表里添加字典时被最后一个覆盖

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

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值