5分钟搞懂 Python 中的 ‘==‘ 和 ‘is‘ ,看这篇就够了
大家好,今天我们来聊一聊Python中两个常常让人困惑的运算符:==
和 is
。虽然它们看起来相似,但实际上有着非常重要的区别。
“==”运算符
“==”运算符用于判断两个对象的值是否相等。它比较的是对象的内容,而不是它们在内存中的位置。
a = [1, 2, 3]
b = [1, 2, 3]
print(a == b)
# 输出: True
在这个例子中,虽然a和b是不同的对象,但它们的内容是相同的,所以“==”运算符返回True。
“is”运算符
“is”运算符用于判断两个对象是否引用同一个内存地址。它比较的是对象的身份(identity),而不是它们的内容。
a = [1, 2, 3]
b = [1, 2, 3]
print(a is b)
# 输出: False
对象的标识符可以简单地理解成对象的内存地址,在生命周期中是固定不变的。id()可以得到对象标识符的整数表示。示例如下:
a = [1, 2, 3]
b = [1, 2, 3]
print(id(a))
print(id(b))
在这个例子中,a和b虽然内容相同,但它们是两个不同的对象,存储在不同的内存位置,所以“is”运算符返回False。
深入理解
值相等与身份相同
为了更好地理解这两个运算符,我们可以将它们类比为生活中的例子。想象两个相同内容的书,虽然它们的内容完全相同,但它们是两本不同的书(不同的物理位置)。这就类似于“==”和“is”的区别。
-
• “==”:这两本书的内容是否相同?
-
• “is”:这两本书是否是同一本书?
常见数据类型的行为
数字和字符串
对于小整数和字符串,Python会进行缓存(interning),所以在某些情况下,“is”可能会返回True。
a = 100
b = 100
print(a is b)
# 输出: True
a = 1000
b = 1000
print(a is b)
# 输出: False
a = "hello"
b = "hello"
print(a is b)
# 输出: True
对于较小的整数(-5到256)和字符串,Python会复用对象,因此“is”运算符可能返回True。但对于较大的整数或某些复杂对象,Python不会复用内存地址,因此“is”运算符会返回False。
列表和字典
对于可变数据类型,如列表和字典,“is”运算符通常返回False,因为每次创建的都是不同的对象。
a = [1, 2, 3]
b = [1, 2, 3]
print(a is b)
# 输出: False
a = {"key": "value"}
b = {"key": "value"}
print(a is b)
# 输出: False
实际案例分析
通过实际案例,我们可以更直观地理解“==”和“is”的区别。
案例一:比较列表
list1 = [1, 2, 3]
list2 = list1
list3 = list1[:]
print(list1 == list2)
# 输出: True
print(list1 is list2)
# 输出: True
print(list1 == list3)
# 输出: True
print(list1 is list3)
# 输出: False
解释:
-
• list1和list2引用同一个列表对象,所以“==”和“is”都返回True。
-
• list3是list1的一个副本(通过切片创建),所以“==”比较内容相同,返回True,但“is”比较内存地址不同,返回False。
案例二:比较字符串
str1 = "hello"
str2 = "hello"
str3 = "".join(["he", "llo"])
print(str1 == str2)
# 输出: True
print(str1 is str2)
# 输出: True
print(str1 == str3)
# 输出: True
print(str1 is str3)
# 输出: False
解释:
-
• str1和str2是相同的字符串常量,Python进行缓存,复用了同一个对象,所以“==”和“is”都返回True。
-
• str3是通过拼接创建的新字符串对象,虽然内容相同,但内存地址不同,所以“==”返回True,而“is”返回False。
最后,大概总结下:
1.在Python中,“==”和“is”是两个功能不同的运算符:
==
(等于): 用于比较两个对象的值是否相等。
is
(身份运算符): 用于比较两个对象的身份(即内存地址)是否相同。
**2.缓存机制的影响:**对于一些小整数和短字符串,Python 会进行缓存,因此在这些情况下,is
可能会返回 True
。
**3.可变对象和不可变对象:**对于可变对象(如列表、字典等),即使内容相同,它们也是不同的对象;而对于不可变对象(如整数、字符串等),可能会因为缓存机制而指向同一个对象。
希望通过这篇文章,你能更清楚地理解 Python 中 ==
和 is
的区别。
关于Python技术储备
学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后给大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!
包括:Python激活码+安装包、Python web开发,Python爬虫,Python数据分析,人工智能、自动化办公等学习教程。带你从零基础系统性的学好Python!
点击领取,100%免费!
👉Python所有方向的学习路线👈
Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。(全套教程文末领取)
👉Python学习视频600合集👈
观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
温馨提示:篇幅有限,已打包文件夹,获取方式在:文末
👉Python70个实战练手案例&源码👈
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
👉Python大厂面试资料👈
我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
👉Python副业兼职路线&方法👈
学好 Python 不论是就业还是做副业赚钱都不错,但要学会兼职接单还是要有一个学习规划。
👉 这份完整版的Python全套学习资料已经上传,朋友们如果需要可以扫描下方CSDN官方认证二维码或者点击链接免费领取【保证100%免费
】