我可以使用:

if A:

而不是

if A is not None:

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


当前回答

我创建了一个名为test.py的文件,并在解释器上运行它。您可以更改您想要更改的内容,以确定事情在幕后是如何进行的。

import dis

def func1():

    matchesIterator = None

    if matchesIterator:

        print( "On if." );

def func2():

    matchesIterator = None

    if matchesIterator is not None:

        print( "On if." );

print( "\nFunction 1" );
dis.dis(func1)

print( "\nFunction 2" );
dis.dis(func2)

这是汇编程序的区别:

来源:

>>> import importlib
>>> reload( test )

Function 1
  6           0 LOAD_CONST               0 (None)
              3 STORE_FAST               0 (matchesIterator)

  8           6 LOAD_FAST                0 (matchesIterator)
              9 POP_JUMP_IF_FALSE       20

 10          12 LOAD_CONST               1 ('On if.')
             15 PRINT_ITEM
             16 PRINT_NEWLINE
             17 JUMP_FORWARD             0 (to 20)
        >>   20 LOAD_CONST               0 (None)
             23 RETURN_VALUE

Function 2
 14           0 LOAD_CONST               0 (None)
              3 STORE_FAST               0 (matchesIterator)

 16           6 LOAD_FAST                0 (matchesIterator)
              9 LOAD_CONST               0 (None)
             12 COMPARE_OP               9 (is not)
             15 POP_JUMP_IF_FALSE       26

 18          18 LOAD_CONST               1 ('On if.')
             21 PRINT_ITEM
             22 PRINT_NEWLINE
             23 JUMP_FORWARD             0 (to 26)
        >>   26 LOAD_CONST               0 (None)
             29 RETURN_VALUE
<module 'test' from 'test.py'>

其他回答

这取决于上下文。

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

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

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

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

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

Python >= 2.6,

如果我们写如

if A:

将生成如下警告:

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

所以我们可以用

if A is not None:

我创建了一个名为test.py的文件,并在解释器上运行它。您可以更改您想要更改的内容,以确定事情在幕后是如何进行的。

import dis

def func1():

    matchesIterator = None

    if matchesIterator:

        print( "On if." );

def func2():

    matchesIterator = None

    if matchesIterator is not None:

        print( "On if." );

print( "\nFunction 1" );
dis.dis(func1)

print( "\nFunction 2" );
dis.dis(func2)

这是汇编程序的区别:

来源:

>>> import importlib
>>> reload( test )

Function 1
  6           0 LOAD_CONST               0 (None)
              3 STORE_FAST               0 (matchesIterator)

  8           6 LOAD_FAST                0 (matchesIterator)
              9 POP_JUMP_IF_FALSE       20

 10          12 LOAD_CONST               1 ('On if.')
             15 PRINT_ITEM
             16 PRINT_NEWLINE
             17 JUMP_FORWARD             0 (to 20)
        >>   20 LOAD_CONST               0 (None)
             23 RETURN_VALUE

Function 2
 14           0 LOAD_CONST               0 (None)
              3 STORE_FAST               0 (matchesIterator)

 16           6 LOAD_FAST                0 (matchesIterator)
              9 LOAD_CONST               0 (None)
             12 COMPARE_OP               9 (is not)
             15 POP_JUMP_IF_FALSE       26

 18          18 LOAD_CONST               1 ('On if.')
             21 PRINT_ITEM
             22 PRINT_NEWLINE
             23 JUMP_FORWARD             0 (to 26)
        >>   26 LOAD_CONST               0 (None)
             29 RETURN_VALUE
<module 'test' from 'test.py'>