详解Python中is和==的区别

在Python中一切都是对象。

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

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

对象之间比较是否相等可以用 == ,也可以用 is 。

is 和 == 都是对对象进行比较判断作用的,但对对象比较判断的内容并不相同。下面来看看具体区别在哪?

is 比较的是两个对象的id值是否相等,也就是比较两个对象是否为同一个实例对象,是否指向同一个内存地址。

== 比较的是两个对象的内容是否相等,默认会调用对象的 __eq__ 方法。

== 是python标准操作符中的比较操作符,用来比较判断两个对象的值是否相等。

先来看一个例子

>>> a = [1, 2, 3]
>>> b = a
>>> b is a
True
>>> b == a
True
>>> b = a[:]
>>> b is a
False
>>> b == a
True

is 也被叫做同一性运算符,也就是id是否相同。

看下面代码, a和b变量的id不同, 所以 b == a 是True, b is a 是False.

再来看一下他们的id:

>>> id(a)
4364243328
>>>
>>> id(b)
4364202696

哪些情况下 is 和 == 结果是完全相同的?

>>> a = 256
>>> b = 256
>>> a is b
True
>>> a == b
True
>>> a = 1000
>>> b = 10**3
>>> a == b
True
>>> a is b
False
>>>

所以数字类型不完全相同。

那为什么256时相同, 而1000时不同呢?

因为出于对性能的考虑,Python内部做了很多的优化工作,对于整数对象,Python把一些频繁使用的整数对象缓存起来,保存到一个叫 small_ints 的链表中,在Python的整个生命周期内,任何需要引用这些整数对象的地方,都不再重新创建新的对象,而是直接引用缓存中的对象。

Python把这些可能频繁使用的整数对象规定在范围 [-5, 256] 之间的小对象放在 small_ints 中,但凡是需要用些小整数时,就从这里面取,不再去临时创建新的对象。

>>> c = 'miracle.young'
>>> d = 'miracle.young'
>>> c is d
False
>>> c == d
True
>>> c = 'miracleyoung'
>>> d = 'miracleyoung'
>>> c is c
True
>>> c == d
True

所以字符串类型不完全相同,这个和解释器实现有关。

>>> a = (1,2,3) # a和b为元组类型
>>> b = (1,2,3)
>>> a is b
False
>>> a = [1,2,3] # a和b为list类型
>>> b = [1,2,3]
>>> a is b
False
>>> a = {'miracle':100,'young':1} # a和b为dict类型
>>> b = {'miracle':100,'young':1}
>>> a is b
False
>>> a = set([1,2,3]) # a和b为set类型
>>> b = set([1,2,3])
>>> a is b
False

所以当变量是数字、字符串、元组,列表,字典时,is 和 == 都不相同, 不能互换使用!当比较值时,要使用 ==,比较是否是同一个内存地址时应该使用is。

当然,开发中比较值的情况比较多。

以上所述是小编给大家介绍的Python中is和==的区别详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • Python中关键字is与==的区别简述

    本文以简单示例分析了python中关键字is与 ==的区别,供大家参考一下. 首先说明一下Python学习中几个相关的小知识点. Python中的对象包含三要素:id.type.value 其中:id用来唯一标识一个对象,type标识对象的类型,value是对象的值 is判断的是a对象是否就是b对象,是通过id来判断的 ==判断的是a对象的值是否和b对象的值相等,是通过value来判断的 具体示例如下: >>> a=100 >>> b=100.0 >>>

  • Python中is和==的区别详解

    Python中有很多运算符,今天我们就来讲讲is和==两种运算符在应用上的本质区别是什么. 在讲is和==这两种运算符区别之前,首先要知道Python中对象包含的三个基本要素,分别是:id(身份标识).type(数据类型)和value(值). is和==都是对对象进行比较判断作用的,但对对象比较判断的内容并不相同.下面来看看具体区别在哪. ==比较操作符和is同一性运算符区别 ==是python标准操作符中的比较操作符,用来比较判断两个对象的value(值)是否相等,例如下面两个字符串间的比较:

  • python中is与双等于号“==”的区别示例详解

    前言 在开始本文之前,首先要知道Python中对象包含的三个基本要素,分别是:id(身份标识).python type()(数据类型)和value(值).is和==都是对对象进行比较判断作用的,但对对象比较判断的内容并不相同.下面来看看具体区别在哪. 发现问题 最近在给小伙伴写段小代码用于爬取一个GIS的各高层数据,python中使用了"is"来代替"==",结果下载至512的时候出了问题. 代码如下 def get_next(x, y, z): z += 1 if

  • Python中is与==判断的区别

    在 Python 中,比较两个对象(变量)是否相等,可以用 "is" 和 "==" 操作,但它俩有什么区别?什么时候用 "is",什么时候用 "==" ?在面试时,发现不少候选人很难把这两者完全说清楚,因此在这篇文章中,「Python之禅」将对二者进行深入浅出的对比介绍. 先举个例子 小黄最近手头非常宽裕,花重金购买了一辆 P90D 特斯拉,我们暂且给这车取名叫 "小P" ,这辆车和隔壁老王家的车(车名叫

  • 详解Python中@staticmethod和@classmethod区别及使用示例代码

    本文主要介绍Python中,class(类)的装饰器@staticmethod和@classmethod的使用示例代码和它们的区别. 1.@staticmethod和@classmethod区别 @staticmethod:静态方法 @classmethod:类方法 一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法. 而使用@staticmethod或@classmethod,就可以不需要实例化,直接通过类名就可以实现调用 使用:直接类名.方法名()来调用.@staticmethod

  • 详解Python中is和==的区别

    在Python中一切都是对象. Python中对象包含的三个基本要素,分别是: id(身份标识) type(数据类型) value(值) 对象之间比较是否相等可以用 == ,也可以用 is . is 和 == 都是对对象进行比较判断作用的,但对对象比较判断的内容并不相同.下面来看看具体区别在哪? is 比较的是两个对象的id值是否相等,也就是比较两个对象是否为同一个实例对象,是否指向同一个内存地址. == 比较的是两个对象的内容是否相等,默认会调用对象的 __eq__ 方法. == 是pytho

  • 详解python中 os._exit() 和 sys.exit(), exit(0)和exit(1) 的用法和区别

    详解python中 os._exit() 和 sys.exit(), exit(0)和exit(1) 的用法和区别 os._exit() 和 sys.exit() os._exit() vs sys.exit() 概述 Python的程序有两中退出方式:os._exit(), sys.exit().本文介绍这两种方式的区别和选择. os._exit()会直接将python程序终止,之后的所有代码都不会继续执行. sys.exit()会引发一个异常:SystemExit,如果这个异常没有被捕获,那

  • 详解Python中sorted()和sort()的使用与区别

    目录 sort()方法是什么 如何妙用sorted() 方法 总结 在 Python 中,你可以使用 sorted() 方法或 sort() 方法对数据进行排序. 在本文中,我将提供 sorted() 和 sort() 方法的代码示例,并解释两者之间的区别. sort()方法是什么 此方法接受一个列表并对其进行排序.但,请记住此方法没有返回值,即返回None. 下面例子中,我们有一个数字列表,我们可以使用 sort() 方法按升序对列表进行排序. my_list = [67, 2, 999, 1

  • 详解Python中range()与xrange()的区别

    目录 前言 返回类型 记忆 操作使用 Speed 前言 range() 和 xrange() 是两个函数,可用于在 Python的 for 循环中迭代一定次数.在 Python 3 中,没有 xrange,但 range 函数的行为类似于 Python 2 中的 xrange.如果要编写可在 Python 2 和 Python 3 上运行的代码,则应使用 range(). range()  – 这将返回一个范围对象(一种可迭代的类型). xrange()  – 此函数返回生成器对象,该生成器对象

  • 详解python中的 is 操作符

    大家可以与Java中的 == 操作符相互印证一下,加深一下对引用和对象的理解.原问题: Python为什么直接运行和在命令行运行同样语句但结果却不同,他们的缓存机制不同吗? 其实,高票答案已经说得很详细了.我只是再补充一点而已. is 操作符是Python语言的一个内建的操作符.它的作用在于比较两个变量是否指向了同一个对象. 与 == 的区别 class A(): def __init__(self, v): self.value = v def __eq__(self, t): return

  • 详解python中asyncio模块

    一直对asyncio这个库比较感兴趣,毕竟这是官网也非常推荐的一个实现高并发的一个模块,python也是在python 3.4中引入了协程的概念.也通过这次整理更加深刻理解这个模块的使用 asyncio 是干什么的? 异步网络操作并发协程 python3.0时代,标准库里的异步网络模块:select(非常底层) python3.0时代,第三方异步网络库:Tornado python3.4时代,asyncio:支持TCP,子进程 现在的asyncio,有了很多的模块已经在支持:aiohttp,ai

  • 详解python中的闭包

    闭包的概念 我们尝试从概念上去理解一下闭包. 在一些语言中,在函数中可以(嵌套)定义另一个函数时,如果内部函数引用了外部函数的变量,则可能产生闭包.闭包可以用来在一个函数与一组"私有"变量之间创建关联关系.在给定函数被多次调用过程中,这些私有变量能够保持持久性. 用比较容易懂得人话说,就是当某个函数被当成对象返回时,夹带了外部变量,就形成了一个闭包.看下例子: def make_printer(msg): def printer(): print(msg) # 夹带私货(外部变量) r

  • 详解Python中的Lock和Rlock

    线程是进程中可以调度执行的实体.而且,它是操作系统中可以执行的最小处理单元.简单地说,一个线程就是一个程序中可以独立于其他代码执行的指令序列.为了简单起见,你可以假设线程只是进程的子集! Locks 锁是Python中用于同步的最简单的方式.锁有两种状态:上锁.释放锁. 锁是线程模块中的一个类,有两个主要方法:acquire()和release() 当调用acquire()方法时,它锁定锁的执行并阻塞锁的执行,直到其他线程调用release()方法将其设置为解锁状态.锁帮助我们有效地访问程序中的

  • 详解Python中的进程和线程

    进程是什么? 进程就是一个程序在一个数据集上的一次动态执行过程.进程一般由程序.数据集.进程控制块三部分组成.我们编写的程序用来描述进程要完成哪些功能以及如何完成:数据集则是程序在执行过程中所需要使用的资源:进程控制块用来记录进程的外部特征,描述进程的执行变化过程,系统可以利用它来控制和管理进程,它是系统感知进程存在的唯一标志. 线程是什么? 线程也叫轻量级进程,它是一个基本的CPU执行单元,也是程序执行过程中的最小单元,由线程ID.程序计数器.寄存器集合和堆栈共同组成.线程的引入减小了程序并发

随机推荐