来自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
所以我想知道为什么not
和if
执行此转换,而in
也不==
对此有正式的解释吗?
答案 0 :(得分:8)
is
是一个检查对象相等性的运算符。换句话说,当且仅当a is b
和a
是指向内存中同一对象的两个名称时,b
才为真。
如果您只想要明确的正常平等或不平等,请使用==
或!=
。但请注意,布尔值永远不会等于列表,因为它们只是不同的类型。 Python中没有像在Javascript中那样进行隐式转换。在比较之前,您仍需要在布尔值中显式转换列表。
答案 1 :(得分:1)
另一种解释可能是operator precedence:is
的绑定比not
更强,所以
not [1] is True
评估为
not ([1] is True])
== not (False) # because a list containing 1 is not the boolean True
== True