为什么在Python中的while循环中空列表的计算结果为False

为什么在Python中的while循环中空列表的计算结果为False,python,list,loops,while-loop,Python,List,Loops,While Loop,while循环在空列表上求值为False的过程是什么 例如: a=[1, 2, 3] while a: a.pop() 本质上,我想知道循环检查列表对象的哪个方法或属性,以决定是否终止。循环和条件隐式地用于所有条件。该程序在文件的章节中有明确的记录。对于像列表这样的序列,这通常是对方法的检查 bool的工作原理如下:首先,它尝试该方法。如果未实现\uuuu bool\uuuu,它将检查\uuuu len\uuuu是否为非零,如果不可能,则只返回True 与所有神奇的方法查找一样,Pyt

while循环在空列表上求值为
False
的过程是什么

例如:

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

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

循环和条件隐式地用于所有条件。该程序在文件的章节中有明确的记录。对于像列表这样的序列,这通常是对方法的检查

bool
的工作原理如下:首先,它尝试该方法。如果未实现
\uuuu bool\uuuu
,它将检查
\uuuu len\uuuu
是否为非零,如果不可能,则只返回
True


与所有神奇的方法查找一样,Python只查看类,而不查看实例(请参阅)。如果您的问题是关于如何改变行为,那么您将需要子类化。为实例字典指定一个替换方法根本不起作用。

好问题!它正在检查
bool(a)
,它(通常)调用
type(a)。\uuubool\uuuuuu(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")
a=MyExampleDataType(5)
b=MyExampleDataType(30)
如果是:
打印(“不打印;5<20”)
如果b:
打印(“将打印;30>20”)

有关更多信息,请参阅Python文档:.

类似于
if my\u var
的条件相当于
if bool(my\u var)
,并对其进行了很好的解释:

bool()的返回值

bool()返回:

如果值被忽略或为False,则为False 如果该值为True,则为True

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

没有

假的

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

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

空映射。例如,{}

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

除这些值外的所有其他值均视为真


可以使用bool()函数检查列表是否为空。如果变量不存在或列表为空,则其计算结果为False

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

a=[1,2,3]

while bool(a) is True:
    a.pop()
甚至更简单:

a = [1,2,3]

while len(a) > 0:

    print(a.pop())

在Python3+中是这样吗?我试了一种新方法。然后a.\uuuu bool\uuuuu()并返回此方法不存在。@VanillaSpice。我已经添加到我的答案中了事实上,我找到了这个链接:,并将它添加到您的答案中,使其更加完整。更好的答案的可能副本是@kvantour。两者都不是好的复制品,我同意“疯狂物理学家”。我认为这里的问题和提供的解决方案更清楚。然后mylist.\uuubool\uuuuuu()并返回此方法不存在。“bool”方法是列表的实际方法吗?@VanillaSpinIce它很复杂。清单是一个坏例子;实际上没有
列表。阅读深入的信息;基本上,Python弥补了
list.\uuu bool\uuu
不是通过另一种方式(即使用
list.\uu len\uu
)来定义信息的事实。但是,几乎没有类似的特殊情况(我认为
如果它们没有明确定义,但我不记得了)。为了向后兼容,truthiness协议必须不断考虑类使用
\uuu len\uuuu
的可能性,而不是新来的
\uu bool\uuuu
(或者它所取代的Python2方法
\uuuu nonzero\uuuuu
)来定义它的真实性。既然如此,就没有令人信服的理由来定义Python3中的
\uuu bool\uuuuu
\uu len\uuuuuu
等内置类型。