例如,如果通过以下步骤:

a = []

如何检查a是否为空?


当前回答

帕特里克(被接受)的答案是正确的:如果不是:是正确的做法。哈雷·霍尔科姆(Harley Holcombe)的回答是正确的,这是在PEP8风格指南中。但没有一个答案能解释为什么遵循这个习语是一个好主意,即使你个人觉得它不够明确或让Ruby用户感到困惑。

Python代码和Python社区有很强的习惯用法。遵循这些习惯用法可以让任何有Python经验的人更容易阅读代码。当你违反这些习惯用语时,这是一个强烈的信号。

的确,如果不是:,就不能将空列表与None、数字0、空元组、空用户创建的集合类型、空用户生成的不完全集合类型、或单个元素NumPy数组用作带有假值的标量等区分开来。在这种情况下,你知道你想表达什么,所以你可以测试一下。例如,如果不是a,并且a不是None:表示“除了None以外的任何错误”,而如果len(a)!=0:表示“只有空序列和除了序列之外的任何东西在这里都是错误的”,以此类推。除了测试你想要测试的东西之外,这也向读者发出了这个测试很重要的信号。

但是,当你没有什么要明确的时候,除了:以外的任何东西都会误导读者。当它不重要的时候,你在发出同样重要的信号。(你也可能会让代码变得不那么灵活,或者更慢,或者其他什么的,但这都不那么重要。)如果你习惯性地这样误导读者,那么当你确实需要做出区分时,它会被忽略,因为你一直在代码中“嚎啕大哭”。

其他回答

我曾写道:

if isinstance(a, (list, some, other, types, i, accept)) and not a:
    do_stuff

投票结果为-1。我不确定这是否是因为读者反对这一策略,或者认为答案没有帮助。我会假装是后者,因为——无论什么叫做“蟒蛇”——这是正确的策略。除非你已经排除了,或者已经准备好处理a为False的情况,否则你需要一个比不是:更严格的测试。你可以用这样的方法:

if isinstance(a, numpy.ndarray) and not a.size:
    do_stuff
elif isinstance(a, collections.Sized) and not a:
    do_stuff

第一个测试是对上面@Mike的回答的回应。第三行也可以替换为:

elif isinstance(a, (list, tuple)) and not a:

如果您只想接受特定类型(及其子类型)的实例,或者使用:

elif isinstance(a, (list, tuple)) and not len(a):

如果不进行显式类型检查,您就可以离开,但前提是周围的上下文已经向您保证a是您准备处理的类型的值,或者如果您确定您不准备处理的那些类型将引发您准备好处理的错误(例如,如果您在未定义的值上调用len,则为TypeError)。总的来说,“蟒蛇”习俗似乎走到了最后一条路。像鸭子一样挤压它,如果它不知道如何呱呱叫,就让它养一只鸭子。不过,你仍然需要考虑你正在做什么样的假设,以及你没有准备好正确处理的案例是否真的会在正确的地方出错。Numpy数组是一个很好的例子,其中仅仅盲目地依赖len或布尔类型转换可能无法实现预期的效果。

来自真实值测试的文档:

此处列出的值以外的所有值均视为True

没有一个错误任何数字类型的零,例如0、0.0、0j。任何空序列,例如“”、()、[]。任何空映射,例如{}。如果类定义了__bool_()或__len__()方法,则该方法返回整数零或布尔值False。

可以看出,空列表[]是错误的,因此对布尔值执行操作听起来最有效:

if not a:
    print('"a" is empty!')

简单的方法是检查长度是否等于零。

if len(a) == 0:
    print("a is empty")

受到dubiusjim解决方案的启发,我建议使用一个额外的常规检查,看看它是否可以迭代:

import collections
def is_empty(a):
    return not a and isinstance(a, collections.Iterable)

注意:如果希望排除空字符串,则字符串被认为是可迭代的add,而不是isinstance(a,(str,unicode))

测试:

>>> is_empty('sss')
False
>>> is_empty(555)
False
>>> is_empty(0)
False
>>> is_empty('')
True
>>> is_empty([3])
False
>>> is_empty([])
True
>>> is_empty({})
True
>>> is_empty(())
True

您甚至可以尝试像这样使用bool()。虽然它的可读性较低,但它确实是一种简洁的方法。

    a = [1,2,3];
    print bool(a); # it will return True
    a = [];
    print bool(a); # it will return False

我喜欢这种方式,因为检查列表是否为空。

非常方便和有用。