将数字1添加到集合无效

时间:2012-05-02 18:53:58

标签: python python-3.x set

我无法将整数1添加到现有集合中。在交互式shell中,这就是我正在做的事情:

>>> 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 个答案:

答案 0 :(得分: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

虽然True是bool而1是int:

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

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

答案 1 :(得分:3)

我相信,虽然我不确定,因为hash(1) == hash(True)1 == Trueset被认为是相同的元素。我不相信应该是这种情况,因为1 is TrueFalse,但我相信它解释了为什么你不能添加它。

答案 2 :(得分:1)

1相当于True,因为1 == True返回true。因此,1的插入被拒绝,因为集合不能重复。

答案 3 :(得分:0)

如果有人对进一步的学习感兴趣,可以使用以下链接。

Is it Pythonic to use bools as ints?

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

答案 4 :(得分: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]