2012-05-02 93 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被拒绝,因为一个集合不能有重复。