【问题标题】:Why does 'if not None' return True?为什么“如果不是无”返回 True?
【发布时间】:2016-12-08 07:18:07
【问题描述】:

我很难理解这个

我试过了:

if not None:
    print('True')

为什么它打印 True? None 类型不应该是None 吗?

【问题讨论】:

  • @Ralf17 那个帖子没有回答我的问题。
  • 我想你之所以被否决有几个原因。 1)您似乎没有对您的问题进行简单的谷歌搜索以找到非常清楚地指出None 被评估为False 的python 文档。 2)校对。 “为什么它是真的?”是相当草率的语法。
  • @Aaron 我建议您应该开始阅读 Python 书籍以了解基本的编程概念。您要问的内容与数学中的算术一样简单且类似。你也可以去python.org/doc了解更多关于Python的知识。
  • @Ralf17 我正在学习diveintopython3 和 LPTHW。

标签: python-3.x nonetype


【解决方案1】:

所有 Python 对象都有一个真值,请参阅Truth Value Testing。这包括None,在布尔上下文中被认为是false

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

None 值是一个哨兵对象,一个信号值。您仍然需要能够测试该对象,并且它具有布尔值非常有帮助。举个例子:

if function_that_returns_value_or_None():

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

【讨论】:

    【解决方案2】:

    Python Documentation

    4.1.真值测试

    可以测试任何对象的真值,用于 if 或 while 条件或作为以下布尔运算的操作数。以下值被认为是错误的:

    错误

    任何数字类型的零,例如,0、0.0、0j。

    任何空序列,例如,''、()、[]。

    任何空映射,例如 {}。

    用户定义类的实例,如果该类定义了 bool() 或 len() 方法,则当该方法返回整数零或 bool 值 False。

    【讨论】:

      【解决方案3】:

      在 Python 中,None 是一个单例。在其他语言中称为null

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

      函数示例:

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

         def test(x):
             if not None:
                 print(x)
      
         >>> test(2)
         2
      

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

         def test(x):
             if 1:
                 print(x)
      
         >>> test(2)
         2
      

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

         def test(x):
             if -1:
                 print(x)
      
         >>> test(2)
         2
      

      4) if 0: 不会在 test() 中打印参数 x

         def test(x):
             if 0:
                 print(x)
      
         >>> test(2)
      

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

         def test(x):
             if True:
                 print(x)
      
         >>> test(2)
         2
      

      【讨论】:

      • None 与其他语言中的null 不同。 null 是没有任何值,None 本身就是一个值。 Python 引用总是存在的,并且需要指向一些东西。 None 对象是一个有用的默认值。 Python 编译器对None 不做任何假设,它是实现nb_bool 槽的对象本身(__bool__ method 的 C-API 等价物,返回0 (false)。一堆对象是falsey 比您给出的示例要大得多。
      【解决方案4】:

      每个值都有一个称为“真实性”的属性。 None 的“真实性”是False。这有几个原因,例如当您认为返回值None 失败或False 时,代码干净。

      ''[]0{} 这样的“空”对象都评估为假。请注意,这不包括像'None'(字符串)或'0' 这样的对象。

      所以if not NoneNone 转换为False

      “Truthiness”也称为“booleaness”,在某些情况下更为正式。

      【讨论】:

        【解决方案5】:

        [讽刺模式开启]

        如果您不满意打印True,您可以将其打印为False

        if not None:
            print('False')
        

        现在它打印 False :)

        编辑:如果您担心它为什么不打印 None 而不是 TrueFalse(或 Apples),您可以让它打印 None

        if not None:
            print('None')
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-01-29
          • 2012-04-03
          • 2021-09-11
          • 2015-05-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多