我可以使用:

if A:

而不是

if A is not None:

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


当前回答

if x: #x is treated True except for all empty data types [],{},(),'',0 False, and None

所以它不等于

if x is not None # which works only on None

其他回答

前者更Pythonic(更好的理想代码),但如果A为False(不是None),则不会执行块。

if x: #x is treated True except for all empty data types [],{},(),'',0 False, and None

所以它不等于

if x is not None # which works only on None

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,将证明为假,这可能导致不希望的结果。

这取决于上下文。

我使用if A:当我期望A是某种类型的集合时,我只想在集合不为空的情况下执行块。这允许调用者传递任何行为良好的集合,无论是否为空,并让它执行我所期望的操作。它还允许None和False抑制块的执行,这偶尔对调用代码很方便。

OTOH,如果我期望A是一些完全任意的对象,但它可以默认为None,那么我总是使用if A不是None,因为调用代码可以故意传递一个引用到一个空集合,空字符串,或一个0值的数字类型,或布尔False,或一些类实例,在布尔上下文中恰好为假。

另一方面,如果我期望A是一些更具体的东西(例如,我要调用方法的一个类的实例),但它可以默认为None,并且我认为默认布尔转换是类的属性,我不介意对所有子类强制执行,那么我只使用if A:来节省我的手指输入额外12个字符的可怕负担。