Python中while cond==None与if cond is None的区别及使用疑问
pyautogui循环匹配图片写法差异说明
1. 循环失效的核心原因
你给出的两段代码最本质的差异不是== None和is None的区别,而是循环控制语句被替换成了单次判断语句:
- 第一段代码用
while关键字:只要t等于None,就会重复执行代码块里的匹配逻辑,直到找到图片、t被赋值为非None值,才会跳出循环往下执行点击操作,所以循环功能正常。 - 第二段代码把
while改成了if:只会判断一次,如果第一次没找到就再执行一次匹配,不管这次有没有找到,都会直接跳出判断往下执行点击,自然没有循环效果。
编辑器给的提示只是要求你修改None的比较方式,并不是要你把while替换成if,你改的时候混淆了两个独立的语法点。
2. == None和is None的区别
PEP8规范明确要求判断变量是否为None时要使用is None/is not None,原因如下:
- None是Python里的单例对象,所有指向None的变量的身份id都是相同的,
is用来判断两个对象是不是同一个内存实例,用来匹配None效率最高且结果准确。 ==是判断两个对象的值是否相等,如果你自定义的类重写了__eq__方法,自定义实例 == None可能会返回不符合预期的True,存在逻辑隐患。
3. 最初写法的正确性评估及优化方案
你最初的写法逻辑是可以跑通的,但存在两个可优化的点:
- 不符合PEP8规范的
== None写法,可以替换为is None消除编辑器告警。 - 打印逻辑位置错误:当前
print("Templates found!")写在while循环内部,每次没找到图片执行重试的时候都会打印“找到模板”的提示,和实际逻辑相反,应该挪到循环外面。
优化后的正确代码如下:
import pyautogui t = pyautogui.locateOnScreen("Templates.png") while t is None: t = pyautogui.locateOnScreen("Templates.png") print("Templates found!") pyautogui.click(t, clicks=2)
如果要减少重复代码,也可以写成更简洁的版本:
while (t := pyautogui.locateOnScreen("Templates.png")) is None: continue print("Templates found!") pyautogui.click(t, clicks=2)
内容的提问来源于stack exchange,提问作者Joy
相关产品推荐
相关产品推荐

