2010-03-12 22 views
0

我新增了两个python,并且正在尝试增长字典的字典。我已经在php和perl中完成了这项工作,但python表现得非常不同。我相信对那些对python更熟悉的人来说是有道理的。这里是我的代码:python中的奇数嵌套字典行为

colnames = ['name','dob','id']; 
tablehashcopy = {}; 
tablehashcopy = dict.fromkeys(colnames,{}); 

tablehashcopy['name']['hi'] = 0; 
print(tablehashcopy); 

输出:

{'dob': {'hi': 0}, 'name': {'hi': 0}, 'id': {'hi': 0}} 

问题从第二到最后一条语句出现(我把打印为了方便)。我预计会发现一个元素已被添加到“名称”字典中,其关键字'hi'和值为0.但是这个键值对已添加到每个子字典中。为什么?

我已经在我的ubuntu机器上测试了这个在python 2.6和python 3.1中的行为是一样的。

回答

3

问题在于你的fromkeys调用。您向它传递了一个空字典,并使用与所有键的值完全相同的空字典。由于正在使用完全相同的字典作为值,向它添加元素意味着您将看到所有键字典的相同元素。

1

dict.fromkeys(seq,[value]) - 如果没有任何内容被传递,那么值默认为None,但是因为您传递了dict,所以它就是每个键 - 值对使用的值。

2

正如msalib所说,你的问题是,dict.fromkeys使字典中的所有条目指向同一个对象。试试这个,而不是为每个键创建一个单独的空字典:

tablehashcopy=dict((key,{}) for key in colnames) 
+0

+1代替'{} .fromkeys' – tgray 2010-03-12 17:44:14

1

在您的源代码中,只有一个内部字典对象被创建并使用了3次。所以当你修改它的时候,你也会看到这个变化3次,因为所有的变量都绑定在同一个变量上。

您可以执行下列操作来解决问题。这将创建若干(key, {})元组,并用它来生成词典:

colnames = ['name','dob','id'] 
tablehashcopy = dict((k, {}) for k in colnames) 
tablehashcopy['name']['hi'] = 0 
print tablehashcopy # use "print(tablehashcopy)" in Python 3 
# output: {'dob': {}, 'name': {'hi': 0}, 'id': {}} 

也请看一看格式(没有分号)和一些陈述,因为它们是没有必要的,我删除了。