关于python 3.x:为什么’if not None’返回True?

Why does 'if not None' return True?

我很难理解这个

我试过:

1
2
if not None:
    print('True')

为什么打印为真?None型不是应该是None型吗?


所有python对象都有一个真值,请参见真值测试。其中包括None,在布尔上下文中被认为是错误的。

此外,not运算符必须始终生成一个布尔结果,要么是True要么是False。如果not None生产了False,那么当bool(None)已经生产了False时,这会令人惊讶。

None值是一个sentinel对象,一个信号值。您仍然需要能够测试该对象,并且它有一个布尔值是非常有用的。例如:

1
if function_that_returns_value_or_None():

如果None没有布尔值,该测试将中断。


python文档

4.1. Truth Value Testing

Any object can be tested for truth value, for use in an if or while condition or as operand of the Boolean operations below. The following values are considered false:

None

False

zero of any numeric type, for example, 0, 0.0, 0j.

any empty sequence, for example, '', (), [].

any empty mapping, for example, {}.

instances of user-defined classes, if the class defines a bool() or len() method, when that method returns the integer zero or bool value False.


每个值都有一个称为"truthness"的属性。None的"真实性"是False。这样做有几个原因,例如,当您认为EDOCX1的返回值(0)为failure或False时,使用clean code。

"空"的对象,如''[]0{}都被认为是错误的。注意,这不包括像EDOCX1(字符串)或'0'这样的对象。

因此,if not NoneNone转换为False

"真实"也被称为"粗俗",在某些情况下更为正式。


[反讽模式]

如果您不喜欢打印True,可以让它打印False

1
2
if not None:
    print('False')

现在打印错误:)

编辑:如果您担心为什么不打印None,而不打印TrueFalseApples,您可以让它打印None

1
2
if not None:
    print('None')

在python中,None是单例的。它在其他语言中被称为null

在您的if not None:中,编译器假定not none表示非空或非零,并且我们知道if语句将非零值评估为True并执行它们。

功能示例:

1)if not None:在test()中打印参数x

1
2
3
4
5
6
   def test(x):
       if not None:
           print(x)

   >>> test(2)
   2

2)if 1:在test()中打印参数x

1
2
3
4
5
6
   def test(x):
       if 1:
           print(x)

   >>> test(2)
   2

3)if -1:在test()中打印参数x。

1
2
3
4
5
6
   def test(x):
       if -1:
           print(x)

   >>> test(2)
   2

4)if 0:没有在test()中打印参数x。

1
2
3
4
5
   def test(x):
       if 0:
           print(x)

   >>> test(2)

5)if True:在test()中打印参数x

1
2
3
4
5
6
   def test(x):
       if True:
           print(x)

   >>> test(2)
   2