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

为什么python dict的fromkeys方法可以接受列表作为参数?,python,dictionary,Python,Dictionary,基于Python2.7 dict的键必须是不可变和可散列的吗?在列表实现中,我发现uuu hash uuu=None,这意味着它是不可散列的 我们可以使用fromkeys创建dict,如下所示: d={}.fromkeys(('Alice', 'Bob'),3000) 因为元组是不可变和可散列的 但我也发现这没关系: d={}.fromkeys(['Alice', 'Bob'],3000) 那真让我困惑。为什么fromkeys会接受列表作为参数? 是否存在从列表到元组的隐式关系? 谢谢 fr

基于Python2.7 dict的键必须是不可变和可散列的吗?在列表实现中,我发现uuu hash uuu=None,这意味着它是不可散列的

我们可以使用fromkeys创建dict,如下所示:

d={}.fromkeys(('Alice', 'Bob'),3000)
因为元组是不可变和可散列的

但我也发现这没关系:

d={}.fromkeys(['Alice', 'Bob'],3000)
那真让我困惑。为什么fromkeys会接受列表作为参数? 是否存在从列表到元组的隐式关系? 谢谢

fromkeys将接受任何iterable作为参数,这是duck类型。需要散列的是iterable的元素,而不是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没有类型要求。

请根据您所写的内容仔细阅读该声明:

dict的键必须是不可变的

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

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

您清楚地提供了这方面的两个示例。最终发生的事情是,这些iterable中的项是不可变的字符串。正是这些项目将成为你字典的关键

举一个例子,您可以从输出中清楚地看到这一点:

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'