6

我最近开始学习 Python,在玩 set 时遇到了一些奇怪的事情。以下代码示例不会产生预期的结果。

a_set = {True,2,3,4}
a_set.add(1)

我希望 a_set 有这些值{True, 1, 2, 3, 4},但是这个代码产生了{True, 2, 3, 4}

对此进行尝试变化也产生了相同的结果:

a_set = {1,2,3,4}
a_set.add(True)

预期{True, 1, 2, 3, 4} 实际 {1, 2, 3, 4}

尝试此操作False0获得相同的结果:

a_set = {False,2,3,4}
a_set.add(0)

预期{False, 0, 2, 3, 4} 实际 {False, 2, 3, 4}

a_set = {0,2,3,4}
a_set.add(False)

预期{False, 0, 2, 3, 4} 实际 {0, 2, 3, 4}

我知道该bool类型是继承自intTrue == 1False == 0但仍然对上述结果感到有些惊讶。

有人知道这种行为是否是设计使然吗?还有可能有一个包含True, False,0和的集合1吗?

我确实进行了相当多的谷歌搜索,但无法找到我的问题的答案。

提前致谢

更新

针对以下评论,我同意以下问题部分回答了我的问题。

Python 中的 False == 0 和 True == 1 是实现细节还是由语言保证?

但我觉得它没有回答我关于集合的行为以及是否有可能同时包含True和的集合的查询1。尽管bool继承自int,但它们是不同的类型,所以我发现集合无法区分True1有点令人困惑的事实。所以这真的是一个关于 Python 中集合行为的问题,而不仅仅是关于True == 1.

4

1 回答 1

8

由于历史(歇斯底里?)原因,Python 的bool类型是 的子类int,并且True等于 1 和False0。

它们也散列到相同的位置:

>>> True == 1
True
>>> hash(True) == hash(1)
True
>>> False == 0
True
>>> hash(False) == hash(0)
True

由于两者True1都被认为是相等的并且它们散列到同一个插槽,因此两者都setdict它们视为同一事物。

您将在字典中看到相同的内容:

>>> True in {1: 'foo'}
True
>>> 1 in {True: 'foo'}
True

这种行为也扩展到其他数字;浮点值等于整数值将显示相同的行为:

>>> {1.0, 1, 2.0, 2}
{1, 2}

但至少发生这种情况的原因更明显。

于 2013-08-15T17:20:58.060 回答