先看一下下面幾條語句結果,可能會覺得不是那麼符合直覺。
>> all([])
True
>> all([[]])
False
>> all([[[]]])
True
一開始在項目中發現all([])返回True,感覺很不理解。
其實all()的原理差不多是這樣的:
def all(iterable):
for x in iterable:
if bool(x) is False: # 只要有一個不滿足,就返回False
return False
return True
① 對於all([]), 列表沒有元素,也就沒有不滿足的,於是就返回True了
② 對於all([[]]), 列表有1個元素,這個元素是[],bool([])是False,所以這個元素不滿足,等價於 all([False]),所以整個斷言就失敗了,返回False
③ 對於all([[[]]]),列表有1個元素,這個元素是[[]], 即有一個空列表的列表,bool([[]])是True,所以這個元素滿足,等價於all([True]),所以整個斷言成功,返回True
對於②和③來說,它們都是有1個元素,區別在於元素[]和[[]],一個是沒有東西
, 一個是有一個東西,雖然這東西是空列表
。bool(沒有東西)是False, bool(有東西)是True。