✅ 为什么用 is不用==?------ 身份比较 vs 值比较

python
在这里插入代码片# 假设有两个 CrossAttention 模块,结构完全相同
attn1 = CrossAttention(...)
attn2 = CrossAttention(...) # 与 attn1 有相同的参数
unet = UNet2DConditionModel(...)
# 假设 unet.down_blocks[0].attentions[0] 就是 attn1
# 遍历
for name, module in unet.named_modules():
if module is attn1: # ✅ 正确:找同一个对象
print(f"Found attn1 at {name}")
if module == attn1: # ❌ 危险:可能误匹配 attn2!
print(f"Matched by value at {name}")
如果用 == 会发生什么?
- CrossAttention 可能没有自定义 eq 方法,那么Python 默认的 == 会回退到 is(对 nn.Module 通常如此)
- 但如果有自定义 eq(比如比较参数是否相同),那么 attn1 == attn2 可能返回 True,即使它们是不同的对象,这会导致错误匹配:你本想找 attn1,却匹配到了 attn2
而 is 永远安全:
module is attn_module 只在 module 和 attn_module 是同一个内存对象时返回 True
这正是模块遍历中唯一正确的判断方式