2012-05-02 56 views
9

我無法將整數1添加到現有集合。在交互式shell中,這是我正在做的:將數字1添加到集合不起作用

>>> st = {'a', True, 'Vanilla'} 
>>> st 
{'a', True, 'Vanilla'} 
>>> st.add(1) 
>>> st 
{'a', True, 'Vanilla'} # Here's the problem; there's no 1, but anything else works 
>>> st.add(2) 
>>> st 
{'a', True, 'Vanilla', 2} 

這個問題在兩個月前發佈,但我相信它被誤解了。 我正在使用Python 3.2.3。

+5

爲什麼你會嘗試存儲在一組真值,字符串和數字?你想解決什麼問題? –

回答

13
>>> 1 == True 
True 

我相信你的問題是,1True是相同的值,所以1「已經在集合」。

>>> st 
{'a', True, 'Vanilla'} 
>>> 1 in st 
True 

在數學運算True本身視爲1

>>> 5 + True 
6 
>>> True * 2 
2 
>>> 3./(True + True) 
1.5 

雖然真正的是一個布爾值,1是一個int:

>>> type(True) 
<class 'bool'> 
>>> type(1) 
<class 'int'> 

因爲1 in st返回true,我想你不應該有任何問題。但這是一個非常奇怪的結果。如果您有興趣進一步閱讀,@Lattyware指向PEP 285,這將深入解釋此問題。

+1

有趣的是,當它們的表示完全不同時,「1」和「真」被認爲是相等的。 –

+1

@MarkRansom我同意,我幾乎把這稱爲一個缺陷?我很想聽聽Guido對這種情況發生的解釋。 –

+0

我想它和'1 == 1.0'沒有區別。它確實看起來很奇怪。 –

3

我相信,雖然我不確定,因爲hash(1) == hash(True)1 == True他們認爲相同的元素由set。我不認爲應該如此,因爲1 is TrueFalse,但我相信它解釋了爲什麼你不能添加它。

+0

'是'結果是一個實現細節,不應該依賴。 '=='是正確的測試。 –

+0

+1,因爲散列等同性在這裏很重要,但我同意Mark的觀點,即你所說的「是」並不真正相關。 '1是1'可能是'False',並且不會違反文檔中的任何內容(類似於'300((299 + 1)''可能會給你'False')。 –

1

1相當於True,因爲1 == True返回true。結果插入1被拒絕,因爲一個集合不能有重複。