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

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类型是从int继承的,并且True == 1False == 0是继承的,但是对于上述结果还是有些惊讶。

有人知道这种行为是否是设计使然吗?还有可能同时包含TrueFalse01的集合吗?

我确实做了很多谷歌搜索,但找不到我的问题的答案。

提前致谢

更新

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

Is False == 0 and True == 1 in Python an implementation detail or is it guaranteed by the language?

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

最佳答案

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

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

>>> 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}

但至少发生这种情况的原因是显而易见的。

关于python - 将1加到包含True的集合中不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18257980/

10-16 18:24