为什么python集只保留False和Zero?

Mar*_*arc 8 python set

创建集合时:

>>> falsey_set = {0, '', False, None}  # set([False, '', None])
>>> falsey_set = {False, '', 0, None}  # set([0,'', None])
>>> # adding an item to the set doesn't change anything either
>>> falsey_set.add(False)  # set([0,'',None])
Run Code Online (Sandbox Code Playgroud)

或字典,在某种程度上模仿行为:

>>> falsey_dict = {0:"zero", False:"false"}  # {0:'false'}  # that's not a typo
>>> falsey_dict = {False:'false', 0:'zero'}  # {False: 'zero'} # again, not a typo
>>> falsey_set.add(())  # set([0,'', None, ()])
>>> falsey_set.add({})  
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'
>>> falsey_dict[()] = 'list'  # {False:'zero', ():'list'}
>>> falsey_dict({}) = 'dict'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'
Run Code Online (Sandbox Code Playgroud)

0False始终从集合中删除另一个.在字典的情况下,它们完全不正确.有这个原因吗?虽然我意识到布尔值是从Python中的整数派生出来的.什么是pythonic推理以这种方式在集合的上下文中行动(我不太关心字典)?因为虽然在truthy比较中有用,如:

>>> False == 0  # True
Run Code Online (Sandbox Code Playgroud)

差异化具有明显的价值:

>>> False is 0  # False
Run Code Online (Sandbox Code Playgroud)

我一直在查看文档,似乎无法找到行为的参考

更新

@delnan我认为你在评论中提到的哈希决定论已经触头.作为@mgilson指出双方 False0使用相同的散列函数,但是这么做object,很多它的子类(即:super)具有相同的散列函数.关键似乎Hashable objects which compare equal must have the same hash value来自文档中的短语.由于,False == 0且两者都是可清除的,因此它们的输出必须与Python的定义相同.最后,定义哈希的状态如何设定在集合成员使用hashability有以下几点:Hashability makes an object usable as a dictionary key and a set member, because these data structures use the hash value internally.虽然我还是不明白,为什么他们都使用相同的散列函数-我可以去这个深定居.

如果我们都同意,那么有人会提出一个完美的答案,我会接受它.如果有一些改进或者如果我不在基地那么请在下面告诉它.

mgi*_*son 3

这是因为False0 散列到相同的值并且相等。

它们散列到相同值的原因是因为bool是 so 的子类,int因此bool.__hash__简单地调用相同的底层机制,该机制int.__hash__调用...

>>> bool.__hash__ is int.__hash__
True
Run Code Online (Sandbox Code Playgroud)

  • “必须”的意思是“确实应该,甚至在文档中明确要求”,而不是“强制执行”的意思。另外,你得到了相反的结果:不同对象的相同哈希值只是普通的碰撞并且是预期的;错误的计数器示例是具有不同哈希值的相同对象。 (2认同)