is 比较对象的身份(即变量是否指向相同的内存区域)。==(eq 运算符)比较值,即对象内容上是否相等。is 应用于身份比较(例如,与 None 比较或单例对象),而不是用于值的相等性检查。
示例:
a = [1, 2, 3] b = [1, 2, 3] print(a == b) # True print(a is b) # False c = None d = None print(c is d) # True
在处理小整数或字符串时,解释器可能会使用“内部化”(缓存对象) ,这有时会使 is 对于相等值为真,但这不应在程序逻辑中使用。
问题: 以下代码将输出什么?
a = 256 b = 256 print(a is b) c = 257 d = 257 print(c is d)为什么?
答案:
对于 -5 到 256 的值,Python 使用整数池。这个范围内的值总是指向相同的对象,因此 a is b 返回 True。257 超出池的范围,因此 c is d 将为 False(对象独立)。
史话
在一个微服务中,字符串相等性检查使用 is 而不是 ==。由于解释器的优化,程序在测试中“稳定”运行,但在重新编译或其他环境更改后开始崩溃。
一位开发者在比较数字时使用了 is 运算符而不是 ==。对于小数字,这在池中工作正常,但对于大数字,导致崩溃和不可预测的结果,造成计算不正确。
在设计授权系统时,通过 is None 检查传入的 JSON(正确),但随后类似地对字符串使用了 if status is "ok"。这被证明是错误的 — 有时条件未满足,导致数据处理逻辑错误。