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

Joh*_*Doe 45 python comparison boolean readability

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

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

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

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

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

问题是,你对这个原则有多远?在哪里划线,同时保持代码安全?

我应该总是使用这种if value is None风格吗?

Woo*_*ble 28

不.如果你想在值为false但是没有时运行代码None,那么这将失败.

使用is None,如果你检查与身份None对象.使用not value如果你只是想值是假的.


Jon*_*erg 27

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

我发现"如果没有价值",那就更清洁了,而Pythonic.

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

>>> a = []
>>> a is []
False
Run Code Online (Sandbox Code Playgroud)

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

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

>>> 'a' is 'a'
True
Run Code Online (Sandbox Code Playgroud)

你应该靠这个.这是一个实现细节,并未指定适用于每个Python版本.


Ach*_*him 8

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

你不应该试图寻找无需思考即可应用的规则。如果你找到了这些规则,那么这就是计算机的工作,而不是人类的工作!;-)


kin*_*all 5

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

但是,if value并且if not value是完全可读和有用的。恕我直言,没有必要更具体,除非您需要以不同的方式对待各种类型的真值或假值,例如,区分 0 和None.