← 返回首页

Python 语法中 “==” 和 “is” 的区别是什么?

在 Python 中,== 和 is 是两个完全不同维度的比较运算符。它们的核心区别在于:== 比较的是“值(Value)”,而 is 比较的是“身份(Identity)”。

1. ==:值相等(Value Equality)

  • 作用:判断两个对象的内容/值是否相同。
  • 底层原理:它实际上调用了对象内部的魔术方法 __eq__()。只要类实现了这个方法,就可以自定义 == 的比较逻辑。
  • 示例:只要两个列表里的元素一模一样,它们就是相等的。
    list1 = [1, 2, 3]
    list2 = [1, 2, 3]
    

    print(list1 == list2) # True (值相同)

2. is:身份相等(Identity Equality)

  • 作用:判断两个变量是否指向内存中的同一个对象(即判断它们的内存地址是否相同)。
  • 底层原理:它等价于 id(a) == id(b)。它不关心对象的内容,只关心它们是不是“同一个东西”。
  • 示例:虽然上面两个列表的值一样,但它们是在内存中分别创建的两个独立对象,所以 is 返回 False。
    print(list1 is list2)  # False (内存地址不同)
    

    list3 = list1
    print(list1 is list3) # True (list3 只是 list1 的一个引用,指向同一块内存)

开发中的核心避坑指南:什么时候该用哪个?

  1. 比较普通值(数字、字符串、列表、字典等): 永远使用 ==。不要使用 is 来比较值,因为 Python 内部有一些缓存机制(如小整数池、字符串驻留),可能会导致 is 碰巧返回 True,从而引发难以察觉的 Bug。

    a = 256
    b = 256
    print(a is b)  # True (因为 Python 缓存了 -5 到 256 的整数)
    

    c = 257
    d = 257
    print(c is d) # False (超出缓存范围,重新分配了内存)

  2. 判断是否为 None: 永远使用 is。None 在 Python 中是一个单例对象(全局唯一),使用 is 不仅语义更清晰,而且性能比 == 更好(不需要调用 __eq__ 方法)。

    if my_var is None:
        print("变量为空")
    

一句话总结:== 问的是“你们俩长得一样吗?”,is 问的是“你们俩是同一个人吗?”。