Python中len(list(results))为何出现32==0的异常判断结果?
问题原因与解决方案
核心原因
pyautogui.locateAllOnScreen()返回的是生成器对象,而非普通列表。生成器的关键特性是:只能被迭代一次。当你第一次调用list(results)时,会遍历整个生成器,把所有元素取出转成列表,此时生成器内部的迭代指针已经走到末尾,后续再尝试遍历它,不会产生任何元素,得到的就是空列表。
代码逐行分析
- 第一行
print(len(list(results))):遍历生成器,取出所有32个匹配结果转成列表,输出长度32,同时生成器被彻底耗尽。 - 第二行
print(len(list(results)) == 0):此时生成器已经没有元素可迭代,转成的列表是空的,长度为0,所以比较结果返回True。 - 第三行的判断条件因此成立,触发
break退出循环。
修复方案
只需要把生成器提前转换为列表并保存,后续操作都基于这个保存好的列表,避免反复消耗生成器:
while not stop: # 提前将生成器转为列表并存储 results = list(pyautogui.locateAllOnScreen('background data/test.png', confidence = 0.9)) print(len(results)) print(len(results) == 0) if len(results) == 0: print('exit loop') break
内容的提问来源于stack exchange,提问作者Toby
相关产品推荐
相关产品推荐

