今天在测试python代码的时候发现一个问题。当嵌套使用列表和字典都时候。我本意是不断的append新的字典到原来的列表中。但是运行结果是list前面元素中的值也被更新呢,最后整个list上面的值是一样。在网上Google了一下,找到了问题所在,原来这是python初学者常碰到的问题。
http://bbs.chinaunix.net/viewthread.php?tid=1787290
这应该是一个可变类型的引用问题。字典和列表都是可变类型,一般不要以列表或字典作为列表的元素。
>>> 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的前后两个元素就不一样了。