Python:如果不是val,则vs如果val为None

时间:2011-08-22 19:20:25

标签: python comparison boolean readability

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

  1. 它不完全可读; if value is None肯定更容易理解。
  2. 这可能会产生影响(并导致细微的错误),因为[]0之类的内容也会评估为False
  3. 我也开始将这个想法应用于其他比较,例如:

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

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

    问题是,你对这个原则有多远?在保持代码安全的同时绘制线条的位置?

    我应该始终使用if value is None样式吗?

5 个答案:

答案 0 :(得分:24)

没有。如果您想在值为false但不是None时运行代码,则会失败。

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

答案 1 :(得分:23)

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

我发现“如果没有价值”,那就是更加清洁和Pythonic。

另外,请注意列表。在比较空列表时,不应使用is。如果您知道要获取列表,请使用“if”检查它是否包含任何内容(或len())。尝试在解释器中键入:

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

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

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

>>> 'a' is 'a'
True

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

答案 2 :(得分:4)

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

但是,if valueif not value非常易读且有用。恕我直言,没有必要更具体,除非你需要以不同方式处理各种类型的真值或虚假值,例如,区分0和None。 / p>

答案 3 :(得分:2)

我的回答很简单,因为它适用于大多数编码问题:不要试着写一些有效的东西。尽可能清楚地表达您的意图。如果要检查值是否为false,请使用if not value。如果您要查看None,请将其记下来。它总是取决于情况和你的判断。

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

答案 4 :(得分:1)

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