2016-11-09 55 views
2

基于Python2.7 字典的键是否必须是不可变的且可散列的?而在列表执行中,我发现__hash__=None,这意味着它不可散列。为什么python dict的fromkeys方法可以接受列表作为参数?

而且我们可以使用fromkeys像这样创建字典:

d={}.fromkeys(('Alice', 'Bob'),3000) 

因为元组是不可改变的,可哈希。

,但我也觉得这是确定的:

d={}.fromkeys(['Alice', 'Bob'],3000) 

这确实让我感到困惑。为什么fromkeys接受一个列表作为参数? 是否有从列表到元组的隐式? 谢谢!

回答

1

非常仔细阅读说明书,根据你写的:字典的

键必须是不可变

fromkeys方法采用迭代。从文档字符串:

返回一个新的字典,其中的键来自iterable,值等于value。

你明确提供了两个这样的例子。结果发生的是,那些迭代中的项目字符串,它们是不可变的。这些项目将成为你的词典的关键。

以你一个例子,你可以清楚地看到这从输出:

d={}.fromkeys(('Alice', 'Bob'),3000) 

输出:

{'Alice': 3000, 'Bob': 3000} 

如果你有这一点,那么你会得到预期的错误,你认为你应该得到:

d={}.fromkeys((['Alice'], ['Bob']),3000) 

Traceback (most recent call last): 
    File "/Users/xxx/dev/rough/goo.py", line 31, in <module> 
    d={}.fromkeys((['Alice'], ['Bob']),3000) 
TypeError: unhashable type: 'list' 
2

fromkeys将接受任何可迭代的参数(这是鸭子键入)。它是可迭代的元素,而不是迭代本身。

文档字符串只是说:

>>> print(dict.fromkeys.__doc__) 
dict.fromkeys(S[,v]) -> New dict with keys from S and values equal to v. 
v defaults to None. 

正如你看到的,对S没有类型的要求。

相关问题