Python中既不为True也不为False的事物

12 投票
7 回答
8586 浏览
提问于 2025-04-15 15:09

我刚发现这个:

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(假)。

当它们被用在ifwhile循环中时,会被转换成布尔值。你不能用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。希望这能解答你的问题。

补充说明TrueFalse 分别等于 10 的原因是因为 bool 类型是 int 类型的一个子类。

撰写回答