对象/布尔等价如何在python中工作?

时间:2015-12-15 14:30:22

标签: python

来自javascript,我发现这种行为很奇怪:

>>> empty_list = []
>>> empty_list == True
False
>>> empty_list is True
False
>>> empty_list is False
False
>>> empty_list == False
False

另一方面:

>>> one_list = [1]
>>> one_list is False
False
>>> one_list is True
False
>>> one_list == False
False
>>> one_list == True
False

实际上,我预计到了:

if []:
  pass # This never done

if [4]:
  pass # This is always done

>>> not []
True
>>> not [1]
False

列表将转换为布尔值。

我知道

>>> bool([])
False
>>> bool([1])
True

所以我想知道为什么notif执行此转换,而in也不==

对此有正式的解释吗?

2 个答案:

答案 0 :(得分:8)

is是一个检查对象相等性的运算符。换句话说,当且仅当a is ba是指向内存中同一对象的两个名称时,b才为真。

如果您只想要明确的正常平等或不平等,请使用==!=。但请注意,布尔值永远不会等于列表,因为它们只是不同的类型。 Python中没有像在Javascript中那样进行隐式转换。在比较之前,您仍需要在布尔值中显式转换列表。

答案 1 :(得分:1)

另一种解释可能是operator precedenceis的绑定比not更强,所以

not [1] is True

评估为

not ([1] is True])
== not (False)      # because a list containing 1 is not the boolean True
== True