python使用{}.fromkeys创建字典后,通过append更新list型value出错?
直接上代码:
header= {'a', 'c', 'b', 'e', 'f'}
然后根据该序列初始化字典dic1,并设置其值默认格式为list:
dic1={}.fromkeys(header,[])
print dic1
输出:{'a': [], 'c': [], 'b': [], 'e': [], 'f': []}
一切都是对的:
然后为key为'a'的键更新value:
dic1['a'].append(1)
print dic1
可输出竟然是:
{'a': [1], 'c': [1], 'b': [1], 'e': [1], 'f': [1]}
按道理应该是
{'a': [1], 'c': [], 'b': [], 'e': [], 'f': []}
可是换一种方式:
直接定义字典的话:
dic2={'a': [], 'c': [], 'b': [], 'e': [], 'f': []}
dic2['a'].append(1)
print dic2
输出则是正常的
{'a': [1], 'c': [], 'b': [], 'e': [], 'f': []}
在pydev中对比,两个变量是一模一样的:
这是为什么呢,求大神支招。
kinodar
9 years, 4 months ago
Answers
Python 里面典型的浅拷贝、深拷贝的问题,类似地还可以查看这个:
http://www.cnblogs.com/btchenguang/archive/2012/01/30/2332479.html
Zhaku
answered 9 years, 4 months ago
原因是第一种情况的列表都是一个对象,第二种则都是不同的对象。他们的key的变量地址都是相同
In [1]: header= {'a', 'c', 'b', 'e', 'f'}
In [2]: dic1={}.fromkeys(header,[])
In [3]: dic1
Out[3]: {'a': [], 'b': [], 'c': [], 'e': [], 'f': []}
In [4]: dic1['a'] is dic1['b']
Out[4]: True
In [5]: dic2={'a': [], 'c': [], 'b': [], 'e': [], 'f': []}
In [6]: dic2['a'] is dic2['b']
Out[6]: False
In [8]: dic1.keys()
Out[8]: ['a', 'c', 'b', 'e', 'f']
In [9]: dic1.keys()[0] is dic2.keys()[0]
Out[9]: True
回归的麒麟
answered 9 years, 4 months ago