为什么在Python的while循环中,空列表会被视为False?

5

当while循环在空列表上评估为False时,发生了什么过程?

例如:

a=[1, 2, 3]
while a:
    a.pop()

基本上,我想知道while循环检查列表对象的哪个方法或属性来决定是否终止。

可能是空列表是否等于None?的重复问题。 - kvantour
更好的可能重复问题是 https://dev59.com/Smkv5IYBdhLWcg3wqSj1 - kvantour
1
@kvantour。两者都不是一个好的重复项。 - Mad Physicist
我同意@Mad Physicist的观点。我认为这里的问题更清晰,解决方案也更明确。 - VanillaSpinIce
4个回答

9
循环和条件语句在所有条件上隐式地使用bool。该过程在文档的"Truth Value Testing"部分明确记录。对于像列表这样的序列,通常会检查__len__方法。 bool的工作方式如下:首先尝试__bool__方法。如果未实现__bool__,则检查__len__是否为非零,如果不可能,只返回True
与所有魔术方法查找一样,Python 只会查看类,而不是实例(请参阅Special method lookup)。如果您的问题是如何更改行为,则需要子类化。将单个替换方法分配给实例字典根本行不通。

1
在Python 3+中是这样吗?我尝试了a=[]。然后执行a.bool(),但它返回该方法不存在。 - VanillaSpinIce
@VanillaSpice。我已经添加到我的答案中。 - Mad Physicist
实际上,我找到了这个链接:https://docs.python.org/3/library/stdtypes.html#truth,并将其添加到您的答案中,使其更加完整。 - VanillaSpinIce

4

好问题!它正在检查bool(a),通常会调用type(a).__bool__(a)

Python使用“魔术方法”来实现某些功能。基本上,如果您定义了这样的数据类型:

class MyExampleDataType:
    def __init__(self, val):
        self.val = val

    def __bool__(self):
        return self.val > 20

然后,这段代码将会执行它看起来要做的事情:
a = MyExampleDataType(5)
b = MyExampleDataType(30)

if a:
    print("Won't print; 5 < 20")
if b:
    print("Will print; 30 > 20")

更多信息请参阅Python文档:3.3 特殊方法名称


我尝试了mylist=[]。然后运行mylist.bool(),结果显示该方法不存在。__bool__方法是list的一个实际方法吗? - VanillaSpinIce
@VanillaSpinIce 这有点复杂。列表不是一个好的例子;实际上并没有 list.__bool__。请阅读这篇文章以获取深入信息;基本上,Python通过另一种方式(即使用 list.__len__)来确定信息,弥补了 list.__bool__ 未定义的缺陷。虽然几乎没有像这样的特殊情况(我认为 <= 比较运算符有时会使用诸如 not > 的东西,如果它们没有被明确定义,但我不记得了)。 - wizzwizz4
2
为了向后兼容,真值协议必须继续考虑一个类使用 __len__ 而不是新手 __bool__(或 Python 2 中替换它的方法 __nonzero__)来定义其真值的可能性。由于情况如此,没有强制性的理由在 Python 3 中为内置类型(如 list)定义 __bool__ __len__ - chepner

1
您可以使用bool()函数来检查列表是否为空。如果变量不存在或者在列表为空的情况下,它将评估为False。

在您的情况下,您可以这样做:

a=[1,2,3]

while bool(a) is True:
    a.pop()

甚至更简单:

a = [1,2,3]

while len(a) > 0:

    print(a.pop())

1

类似 if my_var 的条件等同于 if bool(my_var)这个页面 很好地解释了它:

bool() 的返回值

bool() 返回:

如果省略或为 false,则返回 False

如果为 true,则返回 True

在 Python 中,以下值被视为 false:

None

False

任何数值类型的零。例如,0、0.0、0j

空序列。例如,()、[]、''。

空映射。例如,{}

具有返回 0 或 False 的 bool() 或 len() 方法的类的对象

除了这些值之外的所有其他值都被视为 true。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接