list增加字典元素覆盖问题

python版本为2.5.4
测试问题如下:

>>> result=[]
>>> dict={'a': ''}
>>>
>>> dict['a']='f1'
>>> result.append(dict)
>>> result
[{'a': 'f1'}]
>>>
>>> dict['b']='f2'
>>> result.append(dict)
>>>
>>> result
[{'a': 'f1', 'b': 'f2'}, {'a': 'f1', 'b': 'f2'}]

在append第二个值时,第一个值同时也被更新了!


append常量时候就没问题:

>>> result=[]
>>> result.append({'a': 'f1'})
>>> result
[{'a': 'f1'}]
>>> result.append({'a': 'f1','b':'f2'})
>>> result
[{'a': 'f1'}, {'a': 'f1', 'b': 'f2'}]
本帖最后由 lunarwildgoose 于 2010-09-17 22:10 编辑


这应该是一个可变类型的引用问题。字典和列表都是可变类型,一般不要以列表或字典作为列表的元素。
>>> result=[]         #建立一个指向空列表实例的列表
>>> hi_baby={'a': ''} #建立一个字典引用,此时此字典对象含有一个关键字a
>>> hi_baby['a']='f1'   #修改此实例字典的a关键字的值
>>> result.append(hi_baby)  #把指向此字典对象的引用添加为result的元素
>>> result
[{'a': 'f1'}]
>>>
>>> hi_baby['b']='f2'           #对该字典对象增加一个值对
>>> result.append(hi_baby)  #把此字典对象的引用添加为result的新元素
>>>
>>> result                        #此时result有两个元素,都是指向hi_baby字典对象的引用
[{'a': 'f1', 'b': 'f2'}, {'a': 'f1', 'b': 'f2'}]   #故结果就是两个重复的hi_baby字典的值对

----------
hi_baby其实是运行环境中的一个字典对象的引用, hi_baby={'a': ''},这个式子中左值只是表示它是右值的引用,右值才真正的创建一个字典对象。
如果后面 hi_baby['b']='f2' 改成hi_baby={'a':hi_baby['a'],'b':'f2'},这样这里的hi_baby指向了新建立的字典对象,最后的result的前后两个元素就不一样了。

>>> import copy
>>> Dict={'a': ''}
>>> List=[]
>>> List+=[Dict]
>>> Dict['a']='bb'
>>> List
[{'a': 'bb'}]
>>> List+=[copy.deepcopy(Dict)]
>>> List
[{'a': 'bb'}, {'a': 'bb'}]
>>> Dict['a']='after deepcopy change'
>>> List
[{'a': 'after deepcopy change'}, {'a': 'bb'}]
>>> del Dict
>>> List
[{'a': 'after deepcopy change'}, {'a': 'bb'}]
>>> 




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值