我可以使用:

if A:

而不是

if A is not 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和==。这些东西很难调试,因为它读起来就像散文,我们经常只是粗略地浏览它。

其他回答

这取决于上下文。

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

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

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

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

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

if A is not None

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

if not A

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


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

其他答案都提供了很好的信息,但我觉得这一点需要澄清。

不,你不应该使用:

if A:

如果你需要测试的是:

if A is not None:

前者通常可以作为后者的替代品,但前者是难以发现bug的常见来源。即使您所做的只是编写一些快速的一次性代码,也不应该让自己养成编写bug代码的习惯。训练你的手指和大脑来写和读正确的详细的测试形式:

if A is not None: 

None的常用用法是定义可选的参数值,并给一个变量一个默认的起始值,这意味着“还没有值”,而函数则意味着“没有返回值”。如果你写这样一个函数:

def my_func(a_list, obj=None):
    if obj:          # Trying to test if obj was passed
        a_list.append(obj)
    # do something with a_list

这将适用于许多现实世界的使用,如:

my_func(user_names, "bob")

但如果发生这种情况:

my_func(user_names, "")
my_func(user_names, [])
my_func(user_names, 0)

那么长度为零的对象将不会被添加到列表中。在编写第一个代码时,您可能知道不允许零长度的用户名。所以短代码可以正常工作。但是当您尝试修改代码以使用一个空字符串来表示没有名字的匿名用户之类的东西时,这个函数突然停止了它所期望做的事情(将匿名用户添加到列表中)。

例如,假设你有逻辑来定义何时允许用户登录,写如下:

new_user = get_user_name()

if user_list_ok(my_func(current_users, new_user)):
    # user_list_ok() tests that no more than 10 users can
    # log in at the same time, and that no sigle user can
    # can log in more than 3 times at once.

    # This user is allowed to log in!

    log_user_in(new_user)

现在这会在代码中产生微妙而复杂的错误。“”的匿名用户不会被添加到测试的列表中,因此当系统达到10个用户的限制时,测试仍然允许匿名用户登录,将用户计数推到11。然后,这可能会在系统的另一部分触发一个只需要最多10个用户的错误。

当你需要测试“var没有值”时,你应该总是使用更长的“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'>