python中奇怪的嵌套字典行为

时间:2010-03-12 15:39:19

标签: python dictionary nested

我是新的两个python,我正在尝试增长字典词典。我已经在php和perl中完成了这个,但是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}}

问题出现在第二个到最后一个声明中(为方便起见,我将打印输入)。我希望找到一个元素已添加到'name'字典中,键为'hi',值为0.但是这个键值对已添加到EVERY子字典中。为什么呢?

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

4 个答案:

答案 0 :(得分:3)

问题出在你的fromkeys电话上。你传给它一个空字典,它使用与所有键的值完全相同的空字典。由于完全相同的字典被用作值,因此向其添加元素意味着您将看到所有键字典的相同元素。

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

dict.fromkeys(seq,[value]) - 如果没有传递任何值,则默认值为None,但是因为你传递了一个dict,所以它就是用于每个键值对的。

答案 3 :(得分: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': {}}

请同时查看格式(没有分号)和我删除的一些语句,因为它们是不必要的。