Python: if not val 和 if val is None 的区别

72 投票
5 回答
51557 浏览
提问于 2025-04-17 00:08

我一直习惯用 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 这种写法呢?

5 个回答

8

我的回答很简单,适用于大多数编程问题:不要只想着写出能用的代码,而是要尽量清楚地表达你的意图。如果你想检查一个值是否为假,就用 if not value。如果你想检查是否是 None,就直接写出来。具体情况要根据你的判断来决定。

你不应该试图寻找那些可以不加思考就能应用的规则。如果你找到了这样的规则,那就应该让电脑来处理,而不是人类! ;-)

37

不可以。如果你想在值为假但不是None的时候运行代码,这样做会出错。

如果你是想检查一个值是否是None,就用is None。如果你只是想判断这个值是否为假,那就用not value

52

如果你想要检查一个值是否是None,就直接用比较来判断。如果你只是想看看这个值是否被认为是“假”的(比如空列表、None、False),可以用“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都保证这样工作。

撰写回答