Python `if x is not None` 或 `if not x is None`?[关闭]

2025-04-15 09:20:00
admin
原创
30
摘要:问题描述:我一直认为if not x is None版本更清晰,但谷歌的风格指南和PEP-8都使用了if x is not None。它们之间是否存在细微的性能差异(我假设没有),以及是否存在一种情况,其中一种确实不适合(这使得另一种明显更符合我的惯例)?**我指的是任何单身人士,而不仅仅是None。...比...

问题描述:

我一直认为if not x is None版本更清晰,但谷歌的风格指南和PEP-8都使用了if x is not None。它们之间是否存在细微的性能差异(我假设没有),以及是否存在一种情况,其中一种确实不适合(这使得另一种明显更符合我的惯例)?*

*我指的是任何单身人士,而不仅仅是None

...比较像 None 这样的单例。使用 is 或 is not。


解决方案 1:

由于它们编译为相同的字节码,因此没有性能差异:

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

从文体上来说,我尽量避免使用not x is y,因为人类读者可能会误解为(not x) is y。如果我x is not y这样写,就不会产生歧义。

解决方案 2:

Google 和Python的风格指南都是最佳实践:

if x is not None:
    # Do something about x

使用not x可能会导致不良后果。

见下文:

>>> x = 1
>>> not x
False
>>> x = [1]
>>> not x
False
>>> x = 0
>>> not x
True
>>> x = [0]         # You don't want to fall in this one.
>>> not x
False

您可能有兴趣了解 Python 中文字的计算True结果False

  • 真值检验


编辑以下评论:

我刚刚又做了一些测试。not x is None不会x先求反,然后再与进行比较None。事实上,is这样使用时,运算符的优先级似乎更高:

>>> x
[0]
>>> not x is None
True
>>> not (x is None)
True
>>> (not x) is None
False

因此,not x is None以我的诚实意见,最好避免这种情况。


更多编辑:

我刚刚做了更多测试,确认bukzor的评论是正确的。(至少,我无法证明其他说法。)

这意味着if x is not None结果与 完全相同if not x is None。我承认错误。谢谢 bukzor。

然而,我的答案依然是:使用传统的if x is not None:]

解决方案 3:

代码首先应该让程序员理解,其次才是让编译器或解释器理解。“is not”的结构比“not is”更接近英语。

解决方案 4:

Pythonif x is not None还是if not x is None

TLDR:字节码编译器将它们解析为x is not None- 因此为了可读性,使用if x is not None

可读性

我们使用 Python 是因为我们重视人类的可读性、可用性以及各种编程范式的正确性,而不是性能。

Python 针对可读性进行了优化,尤其是在这种情况下。

解析和编译字节码

的绑定比 的not 绑定更弱is,因此这里没有逻辑上的区别。请参阅文档:

运算符isis not测试对象身份:x is y当且仅当 x 和 y 是同一个对象时才为真。x is not y产生逆真值。

Python语法is not中专门提供了以下功能,以提高语言的可读性:

comp_op: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not' 'in'|'is'|'is' 'not'

因此它也是语法的一个单一元素。

当然,解析方式不一样:

>>> import ast
>>> ast.dump(ast.parse('x is not None').body[0].value)
"Compare(left=Name(id='x', ctx=Load()), ops=[IsNot()], comparators=[Name(id='None', ctx=Load())])"
>>> ast.dump(ast.parse('not x is None').body[0].value)
"UnaryOp(op=Not(), operand=Compare(left=Name(id='x', ctx=Load()), ops=[Is()], comparators=[Name(id='None', ctx=Load())]))"

但字节编译器实际上会将其转换not ... isis not

>>> import dis
>>> dis.dis(lambda x, y: x is not y)
  1           0 LOAD_FAST                0 (x)
              3 LOAD_FAST                1 (y)
              6 COMPARE_OP               9 (is not)
              9 RETURN_VALUE
>>> dis.dis(lambda x, y: not x is y)
  1           0 LOAD_FAST                0 (x)
              3 LOAD_FAST                1 (y)
              6 COMPARE_OP               9 (is not)
              9 RETURN_VALUE

因此,为了便于阅读并按照预期使用语言,请使用is not

不使用它是不明智的。

解决方案 5:

答案比人们想象的要简单。

两种方式都没有任何技术优势,而且“x is not y”是每个人都会使用的,这使得它成为明显的赢家。它是否“更像英语”并不重要;每个人都在使用它,这意味着每个 Python 用户——即使是 Python 看起来和英语完全不一样的中国用户——都能一眼看懂,而那些不太常见的语法则需要额外的脑力劳动来解析。

不要为了与众不同而与众不同,至少在这个领域不要这样做。

解决方案 6:

我个人使用

if not (x is None):

每个程序员,甚至那些不熟悉 Python 语法的程序员,都可以立即理解这一点,没有任何歧义。

解决方案 7:

出于风格原因,运算符比否定的结果更受欢迎。“ ”is not读起来就像英语,但“ ”需要理解运算符的优先级,并且读起来不像英语。is`if x is not None:`if not x is None:

如果存在性能差异,我更倾向于is not,但这几乎肯定不是选择该技术的动机。它显然依赖于具体实现。由于is不可覆盖,因此应该很容易通过优化消除任何差异。

解决方案 8:

if not x is None与其他编程语言更相似,但if x is not None对我来说听起来更清晰(并且在英语语法上更正确)。

话虽如此,但对我来说这似乎更像是一种偏好问题。

解决方案 9:

我更喜欢更具可读性的形式,x is not y
而不是思考如何最终编写运算符的代码处理优先级,以便生成更具可读性的代码。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2482  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1533  
  PLM(产品生命周期管理)项目对于企业优化产品研发流程、提升产品质量以及增强市场竞争力具有至关重要的意义。然而,在项目推进过程中,范围蔓延是一个常见且棘手的问题,它可能导致项目进度延迟、成本超支以及质量下降等一系列不良后果。因此,有效避免PLM项目范围蔓延成为项目成功的关键因素之一。以下将详细阐述三大管控策略,助力企业...
plm系统   0  
  PLM(产品生命周期管理)项目管理在企业产品研发与管理过程中扮演着至关重要的角色。随着市场竞争的加剧和产品复杂度的提升,PLM项目面临着诸多风险。准确量化风险优先级并采取有效措施应对,是确保项目成功的关键。五维评估矩阵作为一种有效的风险评估工具,能帮助项目管理者全面、系统地评估风险,为决策提供有力支持。五维评估矩阵概述...
免费plm软件   0  
  引言PLM(产品生命周期管理)开发流程对于企业产品的全生命周期管控至关重要。它涵盖了从产品概念设计到退役的各个阶段,直接影响着产品质量、开发周期以及企业的市场竞争力。在当今快速发展的科技环境下,客户对产品质量的要求日益提高,市场竞争也愈发激烈,这就使得优化PLM开发流程成为企业的必然选择。缺陷管理工具和六西格玛方法作为...
plm产品全生命周期管理   0  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用