基于Python2.7
dict的键是否必须是不可变的和可清除的?在列表实现中,我发现__hash__=None
,这意味着它不可用。
我们可以使用fromkeys
来创建这样的字典:
d={}.fromkeys(('Alice', 'Bob'),3000)
因为元组是不可变的,可以随意使用。
但我也觉得这没关系:
d={}.fromkeys(['Alice', 'Bob'],3000)
这让我很困惑。为什么fromkeys
接受列表作为参数?
从列表到元组有隐含的吗?
谢谢!
答案 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'