本文目录导读:
在 Python(以及其他一些编程语言中),is 和 是两种非常容易混淆但本质完全不同的比较运算符。
简单一句话总结:
- 比较的是 值)是否相等。
is比较的是 内存地址(是否是同一个对象)。
核心区别示意图
| 运算符 | 可以理解为 | 常见用途 | |
|---|---|---|---|
| 对象的值 (Value) | “这两个东西看起来一样吗?” | 判断变量内容是否相同(如:a == 5) |
|
is |
对象的身份 (Identity) | “这两个东西是同一个东西吗?” | 判断是否为同一个对象(如:a is None) |
通过代码理解
基本例子: 看值,is 看地址
a = [1, 2, 3] b = [1, 2, 3] # 创建了一个全新的列表对象,只是内容相同 print(a == b) # True (虽然地址不同,但里面的值相等) print(a is b) # False (a和b是内存中两个不同的列表对象)
在内存中,a 和 b 指向两个不同的盒子,盒子里装的纸条上都写着“1,2,3”。
赋值操作:is 为 True 的情况
c = [1, 2, 3] d = c # d 指向了同一个列表对象(c的别名) print(c == d) # True (值当然相等) print(c is d) # True (它们就是同一个对象,地址相同)
修改 c 会影响 d,因为它们是同一个人(同一个盒子的两个名字)。
特殊陷阱:小整数、字符串驻留
Python 为了优化性能,对于小整数(通常是 -5 到 256)和短的、无特殊字符的字符串,会进行“驻留”。 这意味着,如果你创建两个值相同的小整数或简单字符串,Python可能会让它们指向同一个对象。
x = 256 y = 256 print(x is y) # True (因为小整数驻留,属于同一个对象) x = 257 y = 257 print(x is y) # False (超出驻留范围,可能是两个对象) s1 = "hello" s2 = "hello" print(s1 is s2) # True (简单字符串驻留) s3 = "hello world" * 2 s4 = "hello world" * 2 print(s3 is s4) # 可能 True 也可能 False (取决于编译器优化,通常可能是True,但不可依赖)
千万不要依赖这个驻留特性,代码中应该只靠
is判断是否是同一个对象,而不是判断值的相等。
典型应用场景
- :几乎所有需要比较数值、文本、列表内容是否相同的场景。(开发人员绝大多数情况下用的都是 )
is:主要用于比较单例(Singleton)对象,其中最著名的是None。
正确写法:
if a is None: # ✅ 正确!判断是否为空对象
pass
if a == None: # ❌ 不推荐,虽然能工作,但语义不准确且效率稍低
pass
另一个常用 is 的地方是比较布尔值(虽然也可以用 ,但推荐 is):
if flag is True:
pass
| 场景 | 应该用哪个 | 原因 |
|---|---|---|
| 判断两个变量内容是否一样(数字、字符串、列表) | 比较值,符合直觉 | |
判断变量是否为 None |
is |
None 是单例,is 是标准做法 |
判断变量是否为 True / False |
is |
虽然 也行,但 is 语义更清晰 |
| 检查两个变量是否指向同一个可变对象(如列表、字典) | is |
想知道修改A是否会同时修改B |
一句话记忆法:
- 问“等于”吗?用 (看内容)。
- 问“是”吗?用
is(看身份)。
标签: 相等运算符