我最近开始学习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}
尝试使用
False
和0
获得相同的结果: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 == 1
和False == 0
是继承的,但是对于上述结果还是有些惊讶。有人知道这种行为是否是设计使然吗?还有可能同时包含
True
,False
,0
和1
的集合吗?我确实做了很多谷歌搜索,但找不到我的问题的答案。
提前致谢
更新
针对以下评论,我同意以下问题部分回答了我的问题。
Is False == 0 and True == 1 in Python an implementation detail or is it guaranteed by the language?
但是我觉得它无法回答关于集的行为以及是否有可能同时包含
True
和1
的集的查询。尽管bool
是从int
继承的,但是它们是不同的类型,因此我发现这样一个事实,即一个集合无法区分True
和1
,这有点令人困惑。因此,实际上这是一个关于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
由于
True
和1
都被视为相等,并且它们哈希到同一插槽,因此set
和dict
都将它们视为同一事物。您会在字典中看到相同的内容:
>>> 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/