我无法弄清楚原因:
f = lambda x: x
In [8]: f is True
Out[8]: False
In [9]: not f is True
Out[9]: True
In [10]: f is False
Out[10]: False
In [11]: f is True
Out[11]: False
In [12]: not f
Out[12]: False
In [13]: not f is True
Out[13]: True
In [14]: not f is False
Out[14]: True
确定。所以直到现在我们可以想象这是由于使用“是”而不是“==”。如下所示:
In [15]: 0.00000 is 0
Out[15]: False
In [16]: 0.00000 == 0
Out[16]: True
确定。但是,为什么我会在功能上这样做:
In [17]: not f == False
Out[17]: True
In [18]: not f == True
Out[18]: True
In [19]: f ==True
Out[19]: False
In [20]: f ==False
Out[20]: False
In [21]: f
Out[21]: <function __main__.<lambda>>
我试图解释它是因为“是”而不是“==”,但是例子19和20压碎了我的逻辑。有人可以解释一下吗?
答案 0 :(得分:5)
is
测试对象标识。将True
与is True
以外的任何内容进行比较始终是错误的。
您的下一组测试将测试not (f == False)
或not (f == True)
;同样,布尔对象仅对自己进行测试,因此与False
进行比较时,== False
以外的任何内容都将测试为false。 not False
然后是真的。
您希望使用bool()
来测试某些内容是真还是假:
>>> bool(f)
True
>>> bool(0)
False
不要使用等式测试来查看某些内容是真还是假。
请注意,在Python中,只有数字0,空容器和字符串以及False
被视为false。默认情况下,其他所有内容在布尔上下文中都被视为true。自定义类型可以实现__nonzero__
method(数字时)或__len__
method(实现容器)来改变该行为。 Python 3将__nonzero__
替换为__bool__
method。
函数没有__nonzero__
或__len__
方法,所以它们始终被认为是真的。
答案 1 :(得分:2)
如果你检查一个函数的“真实性”,你会看到它是真的。
>>> f = lambda x: x
>>> bool(f)
True
您只是简单地将函数本身与True
或False
进行比较,因为它是一个函数。
答案 2 :(得分:1)
==
检查等效性... is
检查身份...
函数是非假值,但它不等于True
def xyz():
pass
if xyz:
#this will trigger since a method is not a falsey value
xyz == True #No it is not equal to true
xyz == False #no it is not equal to false
xyz is True #no it certainly is not the same memory location as true
xyz is False #no it is also not the same memory location as false
答案 3 :(得分:0)
您自己的示例显示f is False
为假,因此我对您的标题感到困惑。
为什么您希望函数的计算结果等于布尔值?这不是一种奇怪的行为吗?