为什么python dict的fromkeys方法可以接受列表作为参数?

时间:2016-11-09 01:33:25

标签: python dictionary

基于Python2.7 dict的键是否必须是不可变的和可清除的?在列表实现中,我发现__hash__=None,这意味着它不可用。

我们可以使用fromkeys来创建这样的字典:

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

因为元组是不可变的,可以随意使用。

但我也觉得这没关系:

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

这让我很困惑。为什么fromkeys接受列表作为参数? 从列表到元组有隐含的吗? 谢谢!

2 个答案:

答案 0 :(得分:2)

fromkeys将接受任何iterable作为参数(这是鸭子打字)。它是需要可转换的迭代元素,而不是可迭代本身。

文档字符串只是说:

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

如您所见,S没有类型要求。

答案 1 :(得分:2)

根据你所写的内容,仔细阅读声明:

dict的键必须是不可变的

fromkeys方法采用可迭代。来自docstring:

  

返回一个新的dict,其中包含来自iterable的键,值等于value。

你清楚地提供了两个例子。最终发生的事情是这些迭代中的 strings ,它们是 immutable 。这些项目将成为您词典的关键。

根据您的一个示例,您可以从输出中清楚地看到这一点:

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'