代码之家  ›  专栏  ›  技术社区  ›  prosseek

python中的not none测试[重复]

  •  573
  • prosseek  · 技术社区  · 14 年前

    这个问题已经有了答案:

    在这些非零测试中。

    if val != None:
    
    if not (val is None):
    
    if val is not None:
    

    哪一个更好,为什么?

    4 回复  |  直到 7 年前
        1
  •  823
  •   Community George Stocker    7 年前
    if val is not None:
        # ...
    

    用于测试变量未设置为 None . 这个成语在 declaring keyword functions with default parameters . is 在python中测试身份。因为只有一个 没有 在运行的python脚本/程序中, 是对此的最佳测试。AS Johnsyweb points out ,这将在中讨论 PEP 8 在“规划建议”下。

    至于为什么这是首选

    if not (val is None):
        # ...
    

    这只是 Zen of Python :“可读性很重要。”好的python通常接近于好的 pseudocode .

        2
  •  93
  •   johnsyweb    14 年前

    从,规划建议, PEP 8 :

    与像“无”这样的单子比较应该总是用 “is”或“is not”,从不使用相等运算符。

    另外,当你真正的意思是“如果x不是无”时,要注意写“如果x” --例如,当测试默认为 没有设置为其他值。另一个值可能具有类型 (例如容器)在布尔上下文中可能是假的!

    对于任何一个Python程序员来说,PEP8都是必不可少的阅读工具。

        3
  •  21
  •   Ignacio Vazquez-Abrams    14 年前

    后两个,因为 val 可能是定义 __eq__() 当通过时返回真 None .

        4
  •  15
  •   SheetJS    11 年前

    对于这些类型的问题,最好的选择是准确地了解Python的功能。这个 dis 模块提供了难以置信的信息:

    >>> def f(val):
    ...   if val != None:
    ...     return True
    ...   return False
    ...
    >>> def g(val):
    ...   if not (val is None):
    ...     return True
    ...   return False
    ...
    >>> def h(val):
    ...   if val is not None:
    ...     return True
    ...   return False
    ...
    >>> import dis
    >>> dis.dis(f)
      2           0 LOAD_FAST                0 (val)
                  3 LOAD_CONST               0 (None)
                  6 COMPARE_OP               3 (!=)
                  9 POP_JUMP_IF_FALSE       16
    
      3          12 LOAD_GLOBAL              1 (True)
                 15 RETURN_VALUE
    
      4     >>   16 LOAD_GLOBAL              2 (False)
                 19 RETURN_VALUE
    >>> dis.dis(g)
      2           0 LOAD_FAST                0 (val)
                  3 LOAD_CONST               0 (None)
                  6 COMPARE_OP               9 (is not)
                  9 POP_JUMP_IF_FALSE       16
    
      3          12 LOAD_GLOBAL              1 (True)
                 15 RETURN_VALUE
    
      4     >>   16 LOAD_GLOBAL              2 (False)
                 19 RETURN_VALUE
    >>> dis.dis(h)
      2           0 LOAD_FAST                0 (val)
                  3 LOAD_CONST               0 (None)
                  6 COMPARE_OP               9 (is not)
                  9 POP_JUMP_IF_FALSE       16
    
      3          12 LOAD_GLOBAL              1 (True)
                 15 RETURN_VALUE
    
      4     >>   16 LOAD_GLOBAL              2 (False)
                 19 RETURN_VALUE
    

    请注意,最后两种情况简化为相同的操作序列(python读取 not (val is None) 并使用 is not 操作员)。第一个使用 != 与无比较时的运算符。

    如其他答案所指出的,使用 != 与没有相比是个坏主意