2016-11-09 71 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沒有類型的要求。

相關問題