2017-08-13 58 views
3

我是Python新手,目前正在學習字典。我將隨機值和類型放在字典中。這裏是什麼困惑我:布爾作爲字典中的關鍵是造成奇怪的問題?

stuff = {True: 1234, 1: 2} 
print(stuff[True]) 
print(len(stuff)) 

當你運行這段代碼,輸出爲:

2 
1 

這是怎麼輸出? print(stuff[True])不應輸出1234print(len(stuff))輸出爲2?我可能會錯過一些非常明顯的東西,但是有人能解釋一下發生了什麼嗎?

+6

'真== 1'; 'bool'是'int'的子類型。 – Ryan

+0

@Ryan所以Python實際上將'{True:1234,1:2}'解釋爲'{1:1234,1:2}'?我想這解釋了「len」問題。但是,爲什麼它會選擇'2'而不是'1234',特別是因爲'1234'首先? – parrot15

+3

如果您有多個相同的密鑰,最後一個是使用其值的那個密鑰。你可以把它看作是「{1:1234,1:2}」,但它不是真的那個; 'True'和'1'是截然不同的,但與'=='相當,並且字典鍵是根據相等性進行比較的。 – Ryan

回答

0

儘管python是動態類型的,但在字典中使用異種密鑰類型被認爲是不好的做法。

運行{True: 'a', 1: 'b', 1.0: 'c'}實際上映射到{True: 'c'}

這是因爲1==1.01==True,因此它們具有相同的hash

最終結果是,第一個鍵將被使用,並且最後一個值將被更新。

如果要出於某種原因分開True1,用自己的類型,鍵以及(如(x, type(x))

{(True, type(True)): 'a',(1, type(1)): 'b', (1.0, type(1.0)): 'c'} 
+0

我會建議'(x,type(x))'比'repr(x)'更有效,但是更便宜' –

+0

注意事項,更正了我的代碼 –