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. 判断是不是None,用is None(别用== None)
- 2. 比较两个值是否相等,用==(别用is)
- 3. 想确认是不是同一个对象,才用is
- 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看身份,==看内容”,就再也不会踩坑啦~
本文内容仅供参考,不构成任何专业建议。使用本文提供的信息时,请自行判断并承担相应风险。



