You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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. 最初写法的正确性评估及优化方案

你最初的写法逻辑是可以跑通的,但存在两个可优化的点:

  1. 不符合PEP8规范的== None写法,可以替换为is None消除编辑器告警。
  2. 打印逻辑位置错误:当前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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 14:45:04