为了账号安全,请及时绑定邮箱和手机立即绑定

不是没有在Python中进行测试

不是没有在Python中进行测试

慕妹3146593 2019-11-21 14:06:56
这些不是“无”测试。if val != None:if not (val is None):if val is not None:哪一个更可取,为什么?
查看完整描述

3 回答

?
HUX布斯

TA贡献1876条经验 获得超6个赞

if val is not None:

    # ...

是用于测试未将变量设置为的Python惯用法None。在用默认参数声明关键字函数的情况下,该惯用法有特殊用途。is在Python中测试身份。因为None正在运行的Python脚本/程序中只有一个实例,所以这是is最佳测试。正如Johnsyweb指出的那样,这在PEP 8中的 “编程建议”中进行了讨论。


至于为什么这是首选


if not (val is None):

    # ...

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


查看完整回答
反对 回复 2019-11-21
?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

来自PEP 8编程建议:


与单例(如None)的比较应始终使用“是”或“不是”进行,永远不要使用相等运算符进行。


另外,当您真正的意思是“如果x不是None”时,要当心写“ if x”-例如,在测试是否将默认为None的变量或参数设置为其他值时。另一个值可能具有在布尔上下文中可能为false的类型(例如容器)!


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


查看完整回答
反对 回复 2019-11-21
?
智慧大石

TA贡献1946条经验 获得超3个赞

这些问题的最佳选择是确切地了解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运算符)。!=与无比较时,第一个使用运算符。


正如其他答案所指出的那样,!=在与“无”进行比较时使用“


查看完整回答
反对 回复 2019-11-21
  • 3 回答
  • 0 关注
  • 374 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信