创建集合时:
>>> 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)
0
并False
始终从集合中删除另一个.在字典的情况下,它们完全不正确.有这个原因吗?虽然我意识到布尔值是从Python中的整数派生出来的.什么是pythonic推理以这种方式在集合的上下文中行动(我不太关心字典)?因为虽然在truthy比较中有用,如:
>>> False == 0 # True
Run Code Online (Sandbox Code Playgroud)
差异化具有明显的价值:
>>> False is 0 # False
Run Code Online (Sandbox Code Playgroud)
我一直在查看文档,似乎无法找到行为的参考
更新
@delnan我认为你在评论中提到的哈希决定论已经触头.作为@mgilson指出双方 False
并0
使用相同的散列函数,但是这么做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.
虽然我还是不明白,为什么他们都使用相同的散列函数-我可以去这个深定居.
如果我们都同意,那么有人会提出一个完美的答案,我会接受它.如果有一些改进或者如果我不在基地那么请在下面告诉它.
这是因为False
和0
散列到相同的值并且相等。
它们散列到相同值的原因是因为bool
是 so 的子类,int
因此bool.__hash__
简单地调用相同的底层机制,该机制int.__hash__
调用...
>>> bool.__hash__ is int.__hash__
True
Run Code Online (Sandbox Code Playgroud)