Python | Python 的 is 和 == 你了解么?

简介: 我是狗哥,一名程序猿。做过 Android、撸过 Java、目前在自学 Python 。注册 「一个优秀的废人」这个公号已有些日子,真正有心将它运营起来是这两天萌生的想法。注册这个号的初衷是分享我的 Python 学习笔记。一个知识,你自己懂,不算是真的懂,你能把他人说懂,才是真正掌握。分享,是一个最好的复习过程。

Python 是一门面向对象的语言,Python中一切皆对象。


Python 中对象包含的三个基本要素,分别是:


  1. id(身份标识)
  2. type(数据类型)
  3. value(值)


其中 id 也代表着内存地址,Python 对象之间比较是否相等既可以用 == ,也可以用 is ,那么二者的区别在哪呢?


既然说到 id 也代表内存地址,那其实 is 比较的就是对象的内存地址,如果两个对象的 id 相等,则说明这两个对象指向的是同一个内存地址,是同一实例对象。而 == 就是比较两个对象的值是否相等,当然,前期是这二者的数据类型一致,否则根本无可比性。另外,== 比较对象通常会调用 Python 的  _ eq _ 方法。


先上一波代码来解释一下。

# partA
>>> j = [6,6,6,6,6,6]
>>> b = j
>>> print(b == j)
True
>>> print(b is j)
True
# partB
>>> j = [6,6,6,6,6,6]
>>> b = [6,6,6,6,6,6]
>>> print(b == a)
True
>>> print(b is a)
False

留意代码你可能有疑问,为毛同样是 list 类型,值一样是 [6,6,6,6,6,6] ,partA 和 partB 的结果不一样呢?


原因是 partA 中,代码 b = j ,意指把 j 赋值给 b,其实底层做得就是将 b 指向 j 的内存地址。而此时二者 id 相等,值相等。而 partB 中,虽然二者的值都是一样的,但是此时 b 并不是指向 j ,而是在内存中重新开辟新空间存储 [6,6,6,6,6,6]。所以 二者的 id 不等,值相等。


不信?你看

# partA
>>> j = [6,6,6,6,6,6]
>>> b = j
>>> print(b == j)
True
>>> print(b is j)
True
>>> print(id(j))
1664043697800
>>> print(id(b))
1664043697800
#partB
>>> j = [6,6,6,6,6,6]
>>> b = [6,6,6,6,6,6]
>>> print(b == a)
True
>>> print(b is a)
False
>>> print(id(j))
1664043698376
>>> print(id(b))
1664043697864


这下该信了吧?


一种特殊情况,先看代码:

# partA
>>> x = 256
>>> y = 256
>>> print(x == y)
True
>>> print(x is y)
True
# partB
>>> x = 1000
>>> y = 1000
>>> print(x == y)
True
>>> print(x is y)
False

我估计又有朋友要惊了个呆了。为毛 x,y 都等于 256 时,is 和 == 的结果是一样的,而 x,y 都等于 1000 时,is 就叛变了呢?


其实这要说到 Python 的优化了。Python 为了性能做了许多优化。而其中就包括对较小的,常用的整数对象的优化,Python 底层有一个名叫 small_ints 的链表。这个链表存储了 Pyhton 最常用的一些小整数,而这些整数的范围就在 [-5 , 256] 之间。每当 程序需要用到这个范围内的整数, Python 就直接到底层链表去取,而不需要重新创建一个整数对象。


比较字符串

# partA
>>> n = 'nasus666'
>>> m = 'nasus666'
>>> print(m == n)
True
>>> print(m is n)
True
# partB
>>> m = 'nasus.666'
>>> n = 'nasus.666'
>>> print(m == n)
True
>>> print(m is n)
False

字符串类型不完全相同,这个结果应该和解释器实现有关。(此处具体原因不明觉厉,请知道的朋友后台留言,万分感谢)


各数据类型的比较结果

# 元组
>>> x = (6,6,6)
>>> y = (6,6,6)
>>> print(x is y)
False
>>> print(x == y)
True
# list
>>> x = [6,6,6]
>>> y = [6,6,6]
>>> print(x is y)
False
>>> print(x == y)
True
# dict 
>>> x = {'狗哥':'很有钱', '家产':'过亿'}
>>> y = {'狗哥':'很有钱', '家产':'过亿'}
>>> print(x == y)
True
>>> print(x is y)
False
# set
>>> x = ([6,6,6,6,6])
>>> y = ([6,6,6,6,6])
>>> print(x == y)
True
>>> print(x is y)
False

当对象为数字,字符串,list,dict,set时,is 和 == 的结果都不同。所以不能随便交换 is 和 == 去比较对象。is 比较的是对像的内存地址,id 值。而 == 更多的是比较对象的值。


总结


  • is 比较两个对象的 id 值是否相等,是否指向同一个内存地址;
  • == 比较的是两个对象的内容是否相等,值是否相等;
  • 小整数对象 [-5,256] 在全局解释器范围内被放入缓存供重复使用;
  • is 运算符比 == 效率高,在变量和 None 进行比较时,应该使用 is。


后语


我不是大神,不是什么牛人,于 Python 领域来说,我是菜鸡,但谁刚开始接触一个领域的时候不是菜鸡呢。 写这个号的目的是为了记录我自学 Python 的笔记。


如果本文对你哪怕有一丁点帮助请右下角点赞,否则忽略就好。平时工作较忙,自学 Python 的时间较少,可能会学得慢点,希望大家多多指教。


我一直认为学习不能有所见即所得的想法,咋一看可能很简单,但当你上手操作可能会出现这样那样的问题,千万不要偷懒,所谓大神都是一个一个坑踩过来的。


实践是检验真理的唯一标准,代码是带着思考敲出来的,不是看出来的,希望你们多点实践。


最后,如果对 Python 、Java 感兴趣请长按二维码关注一波,我会努力带给你们价值,赞赏就不必了,能力没到,受之有愧。

相关文章
|
5月前
|
人工智能 数据挖掘 C++
Python为什么这么优秀
【8月更文挑战第13天】Python是一种广受欢迎的高级编程语言,以其简洁明了的语法、丰富的支持库及强大的社区著称。它适用于从初学者到专家的不同用户群体,并在Web开发、数据分析、人工智能等领域广泛应用。Python支持跨平台操作和面向对象编程,具备动态类型系统和高度编程灵活性。其强大的社区支持体系包括丰富的教程、文档和交流平台,极大地促进了学习与发展。Python还具有卓越的可扩展性,可通过C或C++增强性能,确保简洁性与高效性的结合。在科学计算和数据分析领域,Python借助NumPy、Pandas、SciPy等库成为首选工具;
45 1
|
8月前
|
机器学习/深度学习 人工智能 算法框架/工具
python
python
51 0
|
数据采集 机器学习/深度学习 Java
python介绍
简单易学、明确优雅、开发速度快 跨平台、可移植、可扩展、解释型、面向对象的动态语言 "内置电池",大量的标准库和第三方库 社区活跃,贡献者多,互帮互助 开源语言,发展动力大
|
数据采集 人工智能 Java
哪些python书籍实用价值比较大
当当网上那些实用性比较大的python书籍
|
数据处理 Python
python 小知识 - 类全知道
类是面向对象编程的基础,是python开发过程中需要重要掌握的知识点。
170 0
python 小知识 - 类全知道
|
Shell Python
初识python之技巧总结篇
初识python之技巧总结篇
138 0
初识python之技巧总结篇
|
移动开发 Python