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'}]
>>>