9

我无法将整数添加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。

4

5 回答 5

13
>>> 1 == True
True

我相信你的问题是1并且True是相同的值,所以 1 是“已经在集合中”。

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

在数学运算True中本身被视为1

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

虽然 True 是 bool 而 1 是 int:

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

因为1 in st返回 True,我认为你不应该有任何问题。这是一个非常奇怪的结果。如果您有兴趣进一步阅读,@Lattyware 指向PEP 285,它深入解释了这个问题。

于 2012-05-02T18:56:32.887 回答
3

我相信,尽管我不确定,因为hash(1) == hash(True)而且1 == True它们被set. 我不认为应该是这样1 is TrueFalse但我相信它解释了为什么你不能添加它。

于 2012-05-02T18:56:50.800 回答
1

1相当于Trueas1 == True返回 true。结果,插入1被拒绝,因为集合不能有重复项。

于 2012-05-02T18:58:00.743 回答
0

如果有人有兴趣进一步研究,这里有一些链接。

将布尔值用作整数是 Pythonic 吗?

https://stackoverflow.com/a/2764099/1355722

于 2012-05-02T20:38:16.120 回答
0

如果您想拥有具有相同哈希的项目,我们必须使用列表。如果您绝对确定您的集合需要能够同时包含 True 和 1.0,我很确定您必须定义自己的自定义类,可能是 dict 的一个薄包装。与许多语言一样,Python 的 set 类型只是 dict 的一个薄包装器,我们只对键感兴趣。

前任:

st = {'a', True, 'Vanilla'}

list_st = []

for i in st:
    list_st.append(i)
    
list_st.append(1)

for i in list_st:
    print(f'The hash of {i} is {hash(i)}')

生产

The hash of True is 1
The hash of Vanilla is -6149594130004184476
The hash of a is 8287428602346617974
The hash of 1 is 1

[Program finished]
于 2021-02-22T06:10:57.033 回答