Python 中不是无测试[重复]

问题描述 投票:0回答:4

这些测试中没有任何测试。

if val != None:

if not (val is None):

if val is not None:

哪一个更可取,为什么?

python nonetype
4个回答
1322
投票
if val is not None:
    # ...

是 Python 惯用语,用于测试变量是否未设置为

None
。这个习惯用法在使用默认参数声明关键字函数的情况下有特殊用途。
is
在 Python 中测试身份。由于正在运行的 Python 脚本/程序中存在且仅有一个
None
实例,因此
is
是对此的最佳测试。正如 Johnsyweb 指出的那样,这在 PEP 8 的“编程建议”下进行了讨论。

至于为什么首选这个

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

这只是 Python 之禅的一部分:“可读性很重要。”好的 Python 通常接近于好的 伪代码


148
投票

来自,编程建议,PEP 8

与像 None 这样的单例的比较应该总是使用

is
is not
来完成,而不是使用相等运算符。

此外,当你真正的意思是

if x
时,请小心书写
if x is not None
— 例如当测试默认为 None 的变量或参数是否设置为其他值时。另一个值可能具有在布尔上下文中可能为 false 的类型(例如容器)!

PEP 8 是任何 Python 程序员的必备读物。


39
投票

解决这些类型的问题的最佳选择是看看 python 到底做了什么。

dis
模块内容丰富:

>>> import dis
>>> dis.dis("val != None")
  1           0 LOAD_NAME                0 (val)
              2 LOAD_CONST               0 (None)
              4 COMPARE_OP               3 (!=)
              6 RETURN_VALUE
>>> dis.dis("not (val is None)")
  1           0 LOAD_NAME                0 (val)
              2 LOAD_CONST               0 (None)
              4 COMPARE_OP               9 (is not)
              6 RETURN_VALUE
>>> dis.dis("val is not None")
  1           0 LOAD_NAME                0 (val)
              2 LOAD_CONST               0 (None)
              4 COMPARE_OP               9 (is not)
              6 RETURN_VALUE

请注意,最后两种情况简化为相同的操作序列,Python 读取

not (val is None)
并使用
is not
运算符
。第一个在与 !=
 进行比较时使用 
None
 运算符

正如其他答案所指出的,与

!=
进行比较时使用
None
是一个坏主意。


25
投票

后两者中的任何一个,因为

val
可能是定义
__eq__()
在传递
None
时返回 true 的类型。

© www.soinside.com 2019 - 2024. All rights reserved.