我可以使用:

if A:

而不是

if A is not None:

后者似乎太啰嗦了。有区别吗?


当前回答

Python >= 2.6,

如果我们写如

if A:

将生成如下警告:

FutureWarning:该方法的行为将来会改变 版本。使用特定的'len(elem)'或'elem is not None'测试 代替。

所以我们可以用

if A is not None:

其他回答

该声明

if A:

将调用A.__bool__()(参见特殊方法名称文档),在Python 2中称为__nonzero__,并使用该函数的返回值。总结如下:

object.__bool__(自我) 调用来实现真值测试和内置操作bool();应该返回False或True。如果没有定义此方法,则调用__len__(),如果对象的结果是非零,则认为该对象为真。如果一个类既没有定义__len__()也没有定义__bool__(),则它的所有实例都被认为是真。

另一方面,

if A is not None:

只比较引用A和None,看它们是否相同。

我看过的大多数指南都建议你应该使用

如果一个:

除非你有理由说得更具体些。

有一些细微的差别。除了None,还有其他返回False的值,例如空列表或0,所以要考虑一下你真正要测试的是什么。

None是Python中的一个特殊值,通常指定一个未初始化的变量。要测试A是否没有这个特定的值,可以使用:

if A is not None

Falsey值是Python中一类特殊的对象(例如false,[])。要测试A是否是假的,请使用:

if not A

因此,这两种表达方式是不一样的,你最好不要把它们当作同义词。


附注:None也是假的,所以第一个表达暗示了第二个表达。但是第二个包含了除了None之外的其他错误值。现在…如果你能确定在A中除了None之外没有其他假值,那么你可以用第二个表达式替换第一个表达式。

if A:如果A为0,false,空字符串,空列表或None,将证明为假,这可能导致不希望的结果。

他们做的事情非常不同。

下面检查A除了False、[]、None和0之外是否有其他值。它检查A的值。

if A:

下面检查A是否与None是不同的对象。它检查并比较A和None的引用(内存地址)。

if A is not None:

更新:进一步解释

很多时候,这两者似乎做同样的事情,所以很多人互换使用它们。两者给出相同结果的原因是由于解释器/编译器的优化,如实习或其他原因,很多时候纯属巧合。

考虑到这些优化,相同值的整数和字符串最终将使用相同的内存空间。这可能解释了为什么两个独立的弦表现得好像是一样的。

> a = 'test'
> b = 'test'
> a is b
True
> a == b
True

其他的事情就不一样了。

> a = []
> b = []
> a is b
False
> a == b
True

这两个列表显然有自己的记忆。令人惊讶的是,元组的行为与字符串相似。

> a = ()
> b = ()
> a is b
True
> a == b
True

这可能是因为元组被保证不会改变,因此重用相同的内存是有意义的。

这表明您应该对所使用的比较运算符格外警惕。根据您真正想检查的内容使用is和==。这些东西很难调试,因为它读起来就像散文,我们经常只是粗略地浏览它。