这个问题在这里已经有一个答案:

在这些不是没有测试中。

if val != None:

if not (val is None):

if val is not None:

哪一个是可取的,为什么?

有帮助吗?

解决方案

if val is not None:
    # ...

是用于测试的Pythonic SiviOM,认为变量未设置为 None. 。这个成语在 用默认参数声明关键字函数. is 在Python中测试身份。因为只有一个和一个实例 None 在运行的Python脚本/程序中存在, is 是对此的最佳测试。作为 Johnsyweb指出, ,这是在 PEP 8 在“编程建议”下。

至于为什么优先

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

这只是 Python的禅: :“可读性计数。”好的python通常接近好 伪代码.

其他提示

从编程建议, PEP 8:

与像单人一样的比较,不应始终使用“ IS”或“不是”,而不是平等操作员。

另外,请注意写入“如果x”时,当您真正含义“如果x不是一个”时 - 例如测试默认为none的变量或参数时,将其设置为其他值。另一个值可能具有在布尔上下文中可能是错误的类型(例如容器)!

PEP 8对于任何Python程序员来说都是必不可少的阅读。

后两者中的任何一个,因为 val 可能是定义的类型 __eq__() 通过时返回true None.

这些类型的问题最好的选择是确切查看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 操作员)。第一个使用 != 操作员与无。

正如其他答案所指出的,使用 != 当与众不同时是个坏主意

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top