20210422-python-for循环完成后列表内字典元素被覆盖问题

问题:想得到的对象包含n个字典元素,通过循环获取时,最后得到的列表里每个字典元素都变一样了,打印每次获取的字典数据,却是不一样的。
原因:列表内拿到的字典数据的实质是引用了字典的地址id,而循环外定义的字典,地址始终是唯一的。
解决方案:把字典定义在列表内,则每次的字典实质上是分开的对象。

循环外定义列表内字典

dict = {}
list = []
for i in range(0,5):
    dict['a'] = i
    dict['b'] = i+2
    print('dict_id:',id(dict),'dict:',dict)
    list.insert(i,dict)
    print('循环内:',list)
print('list result:',list)
print('对比列表内不同字典的地址:',id(list[1]), id(list[2]))

结果:

dict_id: 2064131390200 dict: {'a': 0, 'b': 2}
循环内: [{'a': 0, 'b': 2}]
dict_id: 2064131390200 dict: {'a': 1, 'b': 3}
循环内: [{'a': 1, 'b': 3}, {'a': 1, 'b': 3}]
dict_id: 2064131390200 dict: {'a': 2, 'b': 4}
循环内: [{'a': 2, 'b': 4}, {'a': 2, 'b': 4}, {'a': 2, 'b': 4}]
dict_id: 2064131390200 dict: {'a': 3, 'b': 5}
循环内: [{'a': 3, 'b': 5}, {'a': 3, 'b': 5}, {'a': 3, 'b': 5}, {'a': 3, 'b': 5}]
dict_id: 2064131390200 dict: {'a': 4, 'b': 6}
循环内: [{'a': 4, 'b': 6}, {'a': 4, 'b': 6}, {'a': 4, 'b': 6}, {'a': 4, 'b': 6}, {'a': 4, 'b': 6}]
list result: [{'a': 4, 'b': 6}, {'a': 4, 'b': 6}, {'a': 4, 'b': 6}, {'a': 4, 'b': 6}, {'a': 4, 'b': 6}]
对比列表内不同字典的地址: 2064131390200 2064131390200

循环内定义列表内字典

list2 = []
for i in range(0,5):
    dict2 = {}
    dict2['a'] = i
    dict2['b'] = i+2
    print('dict2_id:',id(dict2),'dict:',dict2)
    list2.insert(i,dict2)
    print('循环内:',list2)
print('list2 result:',list2)
print('对比列表内不同字典的地址:',id(list2[1]), id(list2[2]))

结果:

dict2_id: 2064131390632 dict: {'a': 0, 'b': 2}
循环内: [{'a': 0, 'b': 2}]
dict2_id: 2064131390848 dict: {'a': 1, 'b': 3}
循环内: [{'a': 0, 'b': 2}, {'a': 1, 'b': 3}]
dict2_id: 2064131390344 dict: {'a': 2, 'b': 4}
循环内: [{'a': 0, 'b': 2}, {'a': 1, 'b': 3}, {'a': 2, 'b': 4}]
dict2_id: 2064132854336 dict: {'a': 3, 'b': 5}
循环内: [{'a': 0, 'b': 2}, {'a': 1, 'b': 3}, {'a': 2, 'b': 4}, {'a': 3, 'b': 5}]
dict2_id: 2064132853904 dict: {'a': 4, 'b': 6}
循环内: [{'a': 0, 'b': 2}, {'a': 1, 'b': 3}, {'a': 2, 'b': 4}, {'a': 3, 'b': 5}, {'a': 4, 'b': 6}]
list2 result: [{'a': 0, 'b': 2}, {'a': 1, 'b': 3}, {'a': 2, 'b': 4}, {'a': 3, 'b': 5}, {'a': 4, 'b': 6}]
对比列表内不同字典的地址: 2064131390848 2064131390344
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值