python字典和列表

今天在测试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的前后两个元素就不一样了。

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: