原创| Python中"等于"到底用 == 还是 is ?

简介: 原创| Python中"等于"到底用 == 还是 is ?

前言

大家好,我是 kuls。

新年第一篇技术原创。

最近有读者问我一道面试题,希望我能够详细的写一写相关的内容,这不,马上安排!


is 和 == 的区别


看上去其实很简单,但是其中也有很多的细节,今天这篇文章就是带着大家来深入了解相关的知识。


举几个例子

如果一开始就解释,那么肯定很多小伙伴不会理解,所以我们先跑几个程序。


>>> x = y = [4,3,1]
>>> z = [4,3,1]
>>> print(x is y)
True
>>> print(x == y)
True
>>> print(x == z)
True
>>> print(x is z)
False


首先我们来看看这个例子,我们会发现x不管是使用 is 还是 == 都返回True,但是x,z的内容一样,使用 == 返回的True,但是使用 is 时候返回却是False。

在Python中,== 比较的是值,is 比较的是对象。

其中Python对象中主要包含id、值以及数据类型,在is的比较中比较的是id。

所以这里我们再打印一下x、y、z三者的id值


>>> print(id(x))
140513337973408
>>> print(id(y))
140513337973408
>>> print(id(z))
140513337973248


通过比较x与y的id值是相等的,但是z的id值就不同了。

为什么x与y是相同的呢?

在Python中,= 不仅仅只是赋值,它还会将引用地址也赋过去,所以在内存中,x和y调用的是同一个对象。

大家可以参照下图


70.jpg


我们接下来继续看


>>> a = '123'
>>> b = '123'
>>> print(a is b)
True
>>> print(a == b)
True
##############
>>> c = 100
>>> d = 100
>>> print(c == d)
True
>>> print(c is d)
True
##############
>>> a = 1000
>>> b = 1000
>>> print(a is b)
False
>>> print(a==b)
True


看到这里可能有些朋友就迷惑了,这...是啥?

首先我来说下字符串为什么会相等,其实在python中存在一个intern机制,这个机制中值同样的字符串对象仅仅会保存一份,这样做是为了提高Python的运行效率。

那么它是怎么实现的呢?其实很简单,这个intern机制就是通过维护字符串储蓄池(一个字典)来运作的,这个字典的key是字符串的值,value则是这个字符串的引用地址

每次当你创建一个新的字符串时,都会去该字符串储蓄池查找,是否有相同的字符串值,如果存在则直接调用该字符串的引用地址。

相信你看到这,已经明白字符串为什么会一直相等了。


71.jpg


接下来我们继续聊聊下面两个整型的比较,这个更让我们迷惑了。


>>> c = 100
>>> d = 100
>>> print(c == d)
True
>>> print(c is d)
True
##############
>>> a = 1000
>>> b = 1000
>>> print(a is b)
False
>>> print(a==b)
True


其实也并不难理解,在python中有小整数对象池的概念,小整数对象池简单来说就是在[-5,256]这个区间内创建的对象,不会被回收

也就是说,当你创建了一个整数在[-5,256]这个区间内时,它会先去查看是否有相同的值,如果有则直接引用该地址。

如果你创建的不是在这个区间内,那么它会重新创建一个新的对象,所以它的地址肯定也就不同了。

总结:在Python中,只有小整数对象池中和字符串会调用已经存在的地址,其他的像list,tuple,dict都会重新创建一个新的对象。


总结

在Python中,is 和 == 还是有一些区别的,我们不能随意的去使用它。

但是现在我们编写代码基本都是在IDE上,例如pycharm,在pycharm中它对解释器进行了优化,不管你的值是否在区间[-5,256]中,只要值相等那么他们两就会完全相等。所以这里需要特别注意。

OK,以上就是今天的文章,我们下期再见!

记得点赞、关注、在看呀!

相关文章
【原创】Python之禅与翻译之美
Python   对于翻译,我没有什么发言权。我对翻译的了解大多来自思果先生的《翻译研究》和《翻译新究》这两本书。思果先生是著名的散文家、翻译家。
|
13天前
|
人工智能 数据可视化 数据挖掘
探索Python编程:从基础到高级
在这篇文章中,我们将一起深入探索Python编程的世界。无论你是初学者还是有经验的程序员,都可以从中获得新的知识和技能。我们将从Python的基础语法开始,然后逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。最后,我们将通过一些实际的代码示例,来展示如何应用这些知识解决实际问题。让我们一起开启Python编程的旅程吧!
|
12天前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
23天前
|
机器学习/深度学习 数据挖掘 程序员
探索Python编程:从基础到进阶的旅程
在这篇文章中,我们将一同踏上一场激动人心的Python编程之旅。无论你是初学者还是有一定经验的开发者,这里都有适合你的内容。文章分为三个部分:首先是“启程前的准备”,我们会介绍Python的安装和基本工具;其次是“旅途中的风景”,将通过实际代码示例深入探讨Python的核心概念;最后,“到达目的地”会带你了解如何将所学知识应用于实际项目。让我们开始吧!
|
18天前
|
存储 索引 Python
Python编程数据结构的深入理解
深入理解 Python 中的数据结构是提高编程能力的重要途径。通过合理选择和使用数据结构,可以提高程序的效率和质量
131 59
|
12天前
|
小程序 开发者 Python
探索Python编程:从基础到实战
本文将引导你走进Python编程的世界,从基础语法开始,逐步深入到实战项目。我们将一起探讨如何在编程中发挥创意,解决问题,并分享一些实用的技巧和心得。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你提供有价值的参考。让我们一起开启Python编程的探索之旅吧!
36 10
|
15天前
|
机器学习/深度学习 人工智能 Java
Python 语言:强大、灵活与高效的编程之选
本文全面介绍了 Python 编程语言,涵盖其历史、特点、应用领域及核心概念。从 1989 年由 Guido van Rossum 创立至今,Python 凭借简洁的语法和强大的功能,成为数据科学、AI、Web 开发等领域的首选语言。文章还详细探讨了 Python 的语法基础、数据结构、面向对象编程等内容,旨在帮助读者深入了解并有效利用 Python 进行编程。
|
14天前
|
机器学习/深度学习 人工智能 数据挖掘
探索Python编程的奥秘
在数字世界的海洋中,Python如同一艘灵活的帆船,引领着无数探险者穿梭于数据的波涛之中。本文将带你领略Python编程的魅力,从基础语法到实际应用,一步步揭开Python的神秘面纱。
34 12
|
13天前
|
IDE 程序员 开发工具
Python编程入门:打造你的第一个程序
迈出编程的第一步,就像在未知的海洋中航行。本文是你启航的指南针,带你了解Python这门语言的魅力所在,并手把手教你构建第一个属于自己的程序。从安装环境到编写代码,我们将一步步走过这段旅程。准备好了吗?让我们开始吧!
|
14天前
|
关系型数据库 开发者 Python
Python编程中的面向对象设计原则####
在本文中,我们将探讨Python编程中的面向对象设计原则。面向对象编程(OOP)是一种通过使用“对象”和“类”的概念来组织代码的方法。我们将介绍SOLID原则,包括单一职责原则、开放/封闭原则、里氏替换原则、接口隔离原则和依赖倒置原则。这些原则有助于提高代码的可读性、可维护性和可扩展性。 ####