我是新的两个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机器上测试过这个行为是一样的。
答案 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': {}}
请同时查看格式(没有分号)和我删除的一些语句,因为它们是不必要的。