当while循环在空列表上评估为False
时,发生了什么过程?
例如:
a=[1, 2, 3]
while a:
a.pop()
基本上,我想知道while循环检查列表对象的哪个方法或属性来决定是否终止。
当while循环在空列表上评估为False
时,发生了什么过程?
例如:
a=[1, 2, 3]
while a:
a.pop()
bool
。该过程在文档的"Truth Value Testing"部分明确记录。对于像列表这样的序列,通常会检查__len__
方法。
bool
的工作方式如下:首先尝试__bool__
方法。如果未实现__bool__
,则检查__len__
是否为非零,如果不可能,只返回True
。好问题!它正在检查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 特殊方法名称。
list.__bool__
。请阅读这篇文章以获取深入信息;基本上,Python通过另一种方式(即使用 list.__len__
)来确定信息,弥补了 list.__bool__
未定义的缺陷。虽然几乎没有像这样的特殊情况(我认为 <=
比较运算符有时会使用诸如 not >
的东西,如果它们没有被明确定义,但我不记得了)。 - wizzwizz4__len__
而不是新手 __bool__
(或 Python 2 中替换它的方法 __nonzero__
)来定义其真值的可能性。由于情况如此,没有强制性的理由在 Python 3 中为内置类型(如 list
)定义 __bool__
和 __len__
。 - chepner在您的情况下,您可以这样做:
a=[1,2,3]
while bool(a) is True:
a.pop()
a = [1,2,3]
while len(a) > 0:
print(a.pop())
类似 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。