【问题标题】:Python: if not val, vs if val is NonePython:如果不是 val,vs 如果 val 是 None
【发布时间】:2011-08-22 19:20:25
【问题描述】:

我一直以if not value 的风格进行编码,但是,一些指南引起了我的注意,虽然这种风格有效,但它似乎有两个潜在的问题:

  1. 它不完全可读; if value is None 肯定更容易理解。
  2. 这可能会在以后产生影响(并导致细微的错误),因为像 []0 这样的东西也会评估为 False

我也开始将这个想法应用到其他比较中,例如:

  • if not valueif value is False
  • if not valueif value is []

列表也是如此......

问题是,你在原则上走了多远?在保证代码安全的同时,在哪里划清界限?

无论如何我都应该使用if value is None 样式吗?

【问题讨论】:

  • Python 的写作学科之一是 duck 打字。如果是None[]0 等,则表示If something looks like nothing, acts like nothing then it is nothing. 如果您需要更明确地了解正在测试的值,请使用==

标签: python comparison boolean readability


【解决方案1】:

如果您想要的话,请使用与 None 的比较。如果您只想检查该值是否被认为是假的(空列表,无,假),请使用“if not value”。

我发现“if not value”看起来更简洁且符合 Python 风格。

另外,请注意列表。在比较空列表时不应使用 is。如果您知道您正在获取一个列表,请使用if <list> 检查它是否有任何内容(或 len())。尝试在解释器中输入:

>>> a = []
>>> a is []
False

这是因为您刚刚创建的临时列表在内存中的地址与存储在“a”中的地址不同。 None、False 或 True 看不到这一点,因为这些都是单例值(它们都引用内存的同一部分),因此使用 'is' 关键字有效。

您还会发现 CPython 实习生字符串,所以以下工作。

>>> 'a' is 'a'
True

你不应该依赖这个。这是一个实现细节,并没有指定它适用于每个版本的 Python。

【讨论】:

  • 好收获。刚刚了解了有关 is 运算符的新知识。 :) 通过更多研究,我发现if not 适用于0[]False,如前所述,if value is None 适用于None。有道理,因为if not 总是布尔值,但Noneif not 是另一回事,因此if value is None。 :)
【解决方案2】:

没有。如果您想在值为 false 但不是 None 时运行代码,这将非常失败。

如果您使用None 对象检查身份,请使用is None。如果您只想将值设为 False,请使用 not value

【讨论】:

    【解决方案3】:

    您对is 运算符的使用有点问题。例如,if value is [] 将始终为 false,因为没有两个活动列表具有相同的标识。它适用于 None,因为 None 是一个单例(对 None 的所有引用都是同一个对象),但对于其他比较,请使用 ==

    但是,if valueif not value 非常易读且非常有用。恕我直言,没有必要更具体,除非您需要区别对待各种类型的真值或假值,例如区分 0 和 None

    【讨论】:

      【解决方案4】:

      我的回答很简单,因为它适用于大多数编码问题:不要试图编写一些能正常工作的东西。尽量清楚地表达你的意图。如果要检查值是否为假,请使用if not value。如果你想检查None,把它写下来。这始终取决于情况和您的判断。

      你不应该试图找到可以不假思索地应用的规则。如果你找到了这些规则,那是计算机的工作,而不是人类的工作! ;-)

      【讨论】:

        【解决方案5】:
        if not value:
            pass
        

        很好,而且“pythonic”。它不会引起细微的错误,规则很明确并且(我发现)easy to understand

        如果您需要区分 False 和 None,就像您提到的那样使用:

        if not value is None:  # or False, or == [], etc.
            pass
        
        # more readable
        if value is not None:  # or False, or != [], etc.
            pass
        

        我发现上面的内容很少需要。

        一般情况下,最好是做出积极的条件,并把它们放在首位。它们一目了然更容易理解,并且随着复杂性的增加(似乎总是如此)保持良好。

        if value:
            pass
        else:
            pass
        

        【讨论】:

        • 这就是为什么我说它可以导致细微的错误。我宁愿不详述,但这post 应该解释一下。 :)
        • 抱歉,但您需要确定正确的测试并应用它。链接的博客文章是由不了解python的真值测试规则并想使用C代替的人撰写的。当一个人不理解规则时会发生“微妙”的错误。
        • value is not None 往往比not value is None 读起来更好,并且两者都生成完全相同的代码(即is not 运算符)。
        • 是的,我同意。但是仍然会避免它。
        猜你喜欢
        • 1970-01-01
        • 2018-01-15
        • 2021-05-24
        • 2021-09-03
        • 2018-02-15
        • 2018-10-22
        • 1970-01-01
        • 2020-10-20
        • 1970-01-01
        相关资源
        最近更新 更多