字符串比较应使用==而非is,==安全比较内容,is依赖不可靠的字符串驻留机制易致误判;常见错误是用is判断输入字符串是否等于字面量。

在流程控制中直接用双等号(==)比较两个字符串对象,本身不会落入地址陷阱——恰恰相反,== 是安全的值比较方式,它比 is 更适合判断“内容是否相等”。真正会掉进“地址陷阱”的,是误用 is 来代替 ==。
字符串比较该用 ==,不是 is
== 比较的是字符串的内容(即字符序列是否一致),这是语义上最自然、最可靠的方式。Python 会逐个比对字符编码,结果符合直觉:
-
"hello" == "hello"→ True -
"Hello" == "hello"→ False(大小写敏感) -
"abc\n".strip() == "abc"→ True(处理隐藏符后)
is 才是地址陷阱的源头
is 判断的是两个变量是否指向同一个对象(即内存地址是否相同),这依赖于 Python 的字符串驻留(interning)机制——但该机制不保证所有相同字符串都共享地址:
- 短字符串(如
"abc")、标识符风格字符串常被自动驻留 →a = "abc"; b = "abc"; a is b可能为 True - 动态生成或过长字符串(如
"q" * 21)通常不驻留 →a is b返回 False,即使内容完全一样 - 从文件、输入、网络读取的字符串几乎从不驻留 →
input().strip() is "yes"几乎总是 False
常见出错场景
以下写法看似简洁,实则危险:
-
if user_input is "admin":→ 错!应写if user_input == "admin": -
if response is None:→ 对!None 是单例,必须用 is -
if s1 == s2 and s1 is s2:→ 多余且不可靠,删掉is部分
需要额外注意的干扰项
即使用了 ==,也可能得到意外的 False,但这和地址无关,而是值本身有差异:
- 末尾含不可见字符:
"yes\n" == "yes"→ False → 用.strip()清理 - 编码不一致(如混合了全角/半角空格、零宽字符)→ 用
repr(s)查看真实内容 - 大小写混用 → 明确用
.lower()或.casefold()统一后再比

















