返回文章列表
帮助中心

Python中is和==有什么区别?什么时候用is?什么时候用==?

小站
2025-11-20
2周前
Python中is和==有什么区别?什么时候用is?什么时候用==?

刚学Python的小伙伴,是不是都遇到过这种困惑:两个看起来一模一样的值,用is比较返回False,换成==就变成True了?明明都是“等于”,为啥差别这么大?

今天就用最直白的话+生活化例子,帮你彻底搞懂这两个操作符的用法,以后再也不用为这个bug头疼啦~

先看个生活化比喻,秒懂核心区别

咱们先抛开代码,举个日常场景:
你和朋友去图书馆借书,都借了《Python入门》这本书——

  • • 你手里的书和朋友手里的书,内容完全一样(就像两个变量值相同)
  • • 但它们是两本不同的实体书,不是同一本(就像两个变量指向不同对象)
  • • 如果朋友把他的书直接给你,你俩手里的就是同一本书了(就像一个变量赋值给另一个)

对应到Python里:

  • • ==:只关心“内容是不是一样”(两本书的文字相同吗?)
  • • is:只关心“是不是同一个东西”(这是不是物理上的同一本书?)

看段简单代码感受下:

# 两本内容相同的《Python入门》book1 = "Python入门"book2 = "Python入门"# 把book1的书直接给book3book3 = book1print(book1 == book2)  # True → 内容一样print(book1 is book2)  # False → 不是同一本书print(book1 is book3)  # True → 就是同一本书

技术层面拆解:到底在比什么?

1. is:检查“身份”(是不是同一个对象)

is就像检查两个人的身份证号——如果身份证号相同,那肯定是同一个人;如果不同,再像也不是同一人。

在Python里,每个对象都有唯一的“身份证号”,就是它的内存地址,用id()函数能查看:

a = [1, 2, 3]b = a  # 把a的“身份证号”给bc = [1, 2, 3]  # 新创建一个列表,新的“身份证号”print(f"a的内存地址: {id(a)}")  # 比如输出:140688907250240print(f"b的内存地址: {id(b)}")  # 和a完全一样print(f"c的内存地址: {id(c)}")  # 完全不同的数字print(a is b)  # True → 身份证号相同,是同一个对象print(a is c)  # False → 身份证号不同,不是同一个对象

简单说:is比较的是两个变量是不是指向内存里的同一个对象

2. ==:检查“内容”(值是不是相等)

==就像比较两个人的外貌、性格——哪怕不是同一个人,只要这些特征一样,就认为“相等”。

它不管两个变量是不是同一个对象,只看它们的内容是否匹配:

x = [1, 2, 3]y = [1, 2, 3]  # 新对象,但内容和x一样print(x == y)  # True → 内容相等print(x is y)  # False → 不是同一个对象

新手必记:什么时候用is?什么时候用==?

1. 用is的3种场景(记死!)

  • • 判断是否为None(最常用!):# 正确写法(Python官方推荐)if data is None: print("数据为空")# 错误写法(别这么用!)# if data == None:# print("数据为空")原因:Python里只有一个None对象,用is判断最安全,不会出意外。
  • • 判断是否为True/False(单例对象):flag = Trueif flag is True: print("执行成功")
  • • 验证是不是同一个对象:比如确认两个变量是不是指向同一个列表(修改一个会影响另一个)。

2. 用==的所有场景(比较值就用它!)

  • • 比较数字:age == 18、score == 100
  • • 比较字符串:name == "小明"、password == "123456"
  • • 比较列表/字典等容器:list1 == [1,2,3]、dict1 == {"name": "小红"}

简单口诀:is看身份,==看内容

Python的小优化:这些情况is也会返回True?

新手可能会遇到一个奇怪的现象:有些不同创建的变量,用is比较也会返回True?这是Python的优化机制,记住就行,不用深究原理~

1. 小整数缓存(-5到256)

Python会把常用的小整数缓存起来重复使用,所以这些数字用is比较也会True:

a = 100b = 100print(a is b)  # True(在缓存范围内)c = 1000d = 1000print(c is d)  # False(超出缓存范围)

2. 简单字符串驻留

简单的字符串(没有特殊字符)会被Python“记住”,重复创建时会复用:

s1 = "hello"s2 = "hello"print(s1 is s2)  # Trues3 = "hello python!"  # 有特殊字符,不驻留s4 = "hello python!"print(s3 is s4)  # False

新手最容易踩的2个坑!

坑1:用is比较值

# 错误示范(结果不确定!)x = 1000y = 1000if x is y:    print("相等")# 正确写法(比较值永远用==)if x == y:    print("值相等")

坑2:以为容器内容相同就是同一个对象

列表、字典这些容器,哪怕内容一样,也是不同的对象,修改一个不会影响另一个:

list1 = [1, 2, 3]list2 = [1, 2, 3]print(list1 == list2)  # True(内容相同)print(list1 is list2)  # False(不同对象)list1.append(4)print(list1)  # [1,2,3,4]print(list2)  # [1,2,3](没变化)

总结:记住这4条原则,永远不踩坑

  1. 1. 判断是不是None,用is None(别用== None)
  2. 2. 比较两个值是否相等,用==(别用is)
  3. 3. 想确认是不是同一个对象,才用is
  4. 4. 不确定的时候,先用==,大概率不会错

最后来个实战例子,巩固一下:

def check_user(user, expected_name):    # 先判断对象是不是空    if user is None:        return False    # 再比较内容(用户名)    if user.name == expected_name:        return True    return False

怎么样?现在是不是彻底搞懂is和==的区别了?其实Python的设计很合理,两者各司其职,只要记住“is看身份,==看内容”,就再也不会踩坑啦~

本文内容仅供参考,不构成任何专业建议。使用本文提供的信息时,请自行判断并承担相应风险。

分享文章
合作伙伴

本站所有广告均是第三方投放,详情请查询本站用户协议