=用于赋值绑定,==用于值比较;误用会导致逻辑错误或SyntaxError:=仅在变量定义、参数默认值、解包、with/as、for/in中使用,==仅在条件判断、筛选、断言中使用;is则比较对象身份。
= 是赋值操作符,== 是比较操作符。写错会导致逻辑错误或 SyntaxError,而且这类 bug 很难被立刻发现。
=
只在给变量、函数参数默认值、解包、with/as、for/in 等需要绑定名称的场景中使用。
x = 5
def greet(name="world"):
a, b = [1, 2]
with open("f.txt") as f:for i in range(3):(注意:这里的
i 是被 = 隐式赋值的)在 if、while、assert 或函数调用参数里误写 =,Python 会直接报 SyntaxError —— 例如 if x = 5: 是非法语法。
==
只在判断两个对象「值是否相等」时使用,比如条件分支、单元测试断言、过滤数据等。
if user_input == "quit":
[x for x in data if x["status"] == "active"]
assert result == expected
== 触发对象的 __eq__ 方法,所以自定义类可以重载它;而 = 永远不触发任何方法,只是绑定引用。
最典型的错误是把 == 写成 = 在条件中,但 Python 语法层就拦住了;真正危险的是反向——在本
该赋值的地方用了 ==,程序不会报错,但逻辑完全失效。
if flag == True: 能运行,但多余且易出错(应直接写 if flag:)while count == 0: 如果 count 初始不为 0,循环一次都不执行,可能不是你想要的{x == y} 得到的是布尔值集合,不是你期望的值== 可能失败:0.1 + 0.2 == 0.3 返回 False,该用 math.isclose()
=、==、is 三者语义完全不同:
=:绑定名字到对象(不比较)==:调用 __eq__ 比较值(可被重载)is:比较对象身份(即内存地址是否相同),用于 None、单例、小整数缓存等场景比如 a = [1, 2]; b = a; a is b 是 True,但 a == [1, 2] 是 True,a is [1, 2] 是 False —— 这个区别在调试共享状态 bug 时特别关键。