Python中既不为True也不为False的事物
我刚发现这个:
a = (None,)
print (a is True)
print (a is False)
print (a == True)
print (a == False)
print (a == None)
print (a is None)
if a : print "hello"
if not a : print "goodbye"
它产生了:
False
False
False
False
False
False
hello
所以,既不是True也不是False,但在if语句中却表现得像True。
这是为什么呢?
更新:
其实,我刚意识到这并没有我想象中那么复杂。对于a=2,我也得到了相同的结果(不过对于a=0和a=1就不一样了,前者被认为等于False,后者被认为等于True)。
7 个回答
2
在Python中,东西不一定非得是True
(真)或者False
(假)。
当它们被用在if
或while
循环中时,会被转换成布尔值。你不能用is
或者==
来测试它们的值是什么。你应该使用bool( thing )
来检查。
>>> a = (None,)
>>> bool(a)
True
另外要注意:
>>> 10 == True
False
>>> 10 is True
False
>>> bool(10)
True
13
我发现这里几乎所有的解释都没什么帮助,所以我再试一次:
这里的困惑在于“is”、“==”和“if”这三者是不同的东西。
- “is”用来测试身份,也就是说,它检查的是两个对象是否是同一个。这在这个例子中显然是不成立的。
- “==”用来测试值是否相等,显然,只有内置的对象True和False的值是True和False(除了数字0和1,任何数字类型都算)。
接下来是重要的部分:
- “if”用来测试布尔值。这意味着你给它的任何表达式,都会被转换成True或False。你也可以用bool()来做到这一点。而bool((None,))会返回True。那些会被评估为False的东西在文档中有列出(其他人这里有链接)。
也许这只是我自己理解得更清楚,但至少我试过了。:)
9
a
是一个只有一个元素的元组,它的值会被判断为 True
。而 is
是用来检查对象的身份的,所以在这些测试中你会得到 False
。而 ==
是用来检查对象是否相等的,因此你也会得到 False
。
在 if
语句中,会使用 __bool__
(或者 __nonzero__
)来判断这个对象的真假,对于一个非空的元组,它应该返回 True
,所以你会得到 True
。希望这能解答你的问题。
补充说明:True
和 False
分别等于 1
和 0
的原因是因为 bool
类型是 int
类型的一个子类。