问题:想得到的对象包含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