为什么python中的函数是假的?

时间:2014-01-08 16:50:26

标签: python boolean

我无法弄清楚原因:

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压碎了我的逻辑。有人可以解释一下吗?

4 个答案:

答案 0 :(得分:5)

is测试对象标识。将Trueis 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

您只是简单地将函数本身与TrueFalse进行比较,因为它是一个函数。

答案 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为假,因此我对您的标题感到困惑。

为什么您希望函数的计算结果等于布尔值?这不是一种奇怪的行为吗?