编程后端/Python 开发者

解释 Python 中 is 和 == 运算符的语义。它们之间有什么区别以及何时使用每个运算符是至关重要的?请给出典型陷阱的示例。

用 Hintsage AI 助手通过面试

答案

  • 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(对象独立)。


史话

示例 1

在一个微服务中,字符串相等性检查使用 is 而不是 ==。由于解释器的优化,程序在测试中“稳定”运行,但在重新编译或其他环境更改后开始崩溃。


示例 2

一位开发者在比较数字时使用了 is 运算符而不是 ==。对于小数字,这在池中工作正常,但对于大数字,导致崩溃和不可预测的结果,造成计算不正确。


示例 3

在设计授权系统时,通过 is None 检查传入的 JSON(正确),但随后类似地对字符串使用了 if status is "ok"。这被证明是错误的 — 有时条件未满足,导致数据处理逻辑错误。