首先,Python中的is就是判断地址是否相等(相当于Java中的==),Python中的==就是判断数值是否相等(相当于Java中的equals)。

看个简单的例子:

  1. a = [1, 2, 3]
  2. b = [1, 2, 3]
  3. id(a)
  4. Out[16]: 2531065911112
  5. id(b)
  6. Out[17]: 2531064874824
  7. a == b
  8. Out[18]: True
  9. a is b
  10. Out[19]: False

因为地址不同,但是元素是相同的。

但是会发现一些好玩的东西,比如:

  1. a = 100
  2. b = 100
  3. id(a)
  4. Out[22]: 140720205396832
  5. id(b)
  6. Out[23]: 140720205396832
  7. a == b
  8. Out[24]: True
  9. a is b
  10. Out[25]: True
  1. a = 10000
  2. b = 10000
  3. id(a)
  4. Out[29]: 2531066740880
  5. id(b)
  6. Out[30]: 2531066741104
  7. a == b
  8. Out[31]: True
    a is b
    Out[32]: False

我们发现上面两个结果竟然不同,怎么回事呢?

原来是因为Python中整型的复用机制:

在python的整型对象中,将-5~256(python源码中定义)这些整数对象放于小整数对象池中缓存。

python中除上述的小整数外其他称为大整数,创建时为其分配空间。

但创建两个相同的大整数时,会为其分配不同的地址空间。

同理针对字符串:

  1. a = 'chenchi'
  2. b = 'chenchi'
  3. id(a)
  4. Out[35]: 2531066870728
  5. id(b)
  6. Out[36]: 2531066870728
  7. a == b
  8. Out[37]: True
  9. a is b
  10. Out[38]: True

在创建字符串时,python会根据字符串长度判断是否创建字符串对象。在WIN32平台上,最大为2147483647,即2GB,大于该值不会创建字符串对象。

python字符串对象中,存在intern机制,即共享机制。对于空字符串,python只会在第一次使用时创建,后面使用时只会返回原来创建的对象(类似单例模式)。

对于应用了intern机制的字符串对象,会直接返回对象的引用。实际使用中,创建两个相同的字符串变量时,地址是相同的。

参考

https://blog.csdn.net/qq_33512078/article/details/78357773

聊聊Python中的is和==的更多相关文章

  1. 聊聊Python中的闭包和装饰器

    1. 闭包 首先我们明确一下函数的引用,如下所示: def test1(): print("--- in test1 func----") # 调用函数 test1() # 引用函 ...

  2. 聊聊Python中的生成器和迭代器

    Python中有两个重要的概念,生成器和迭代器,这里详细记录一下. 1. 生成器 什么是生成器呢? 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包 ...

  3. 聊聊Python中的多进程和多线程

    今天,想谈一下Python中的进程和线程. 最近在学习Django的时候,涉及到了多进程和多线程的知识点,所以想着一下把Python中的这块知识进行总结,所以系统地学习了一遍,将知识梳理如下. 1. ...

  4. 聊聊Python中的GIL

    对于广大写Python的人来说,GIL(Global Interpreter Lock, 全局解释器锁)肯定不陌生,但未必清楚GIL的历史和全貌是怎样的,今天我们就来梳理一下GIL. 1. 什么是GI ...

  5. 聊聊Python中的描述符

    描述符是实现描述符协议方法的Python对象,当将其作为其他对象的属性进行访问时,该描述符使您能够创建具有特殊行为的对象. 通常,描述符是具有“绑定行为”的对象属性,其属性访问已被描述符协议中的方法所 ...

  6. Python中的多线程编程,线程安全与锁(一)

    1. 多线程编程与线程安全相关重要概念 在我的上篇博文 聊聊Python中的GIL 中,我们熟悉了几个特别重要的概念:GIL,线程,进程, 线程安全,原子操作. 以下是简单回顾,详细介绍请直接看聊聊P ...

  7. 最全总结 | 聊聊 Python 办公自动化之 Excel(中)

    1. 前言 上一篇文章中,我们聊到使用 xlrd.xlwt.xlutils 这一组合操作 Excel 的方法 最全总结 | 聊聊 Python 办公自动化之 Excel(上) ​本篇文章将继续聊另外一 ...

  8. 最全总结 | 聊聊 Python 办公自动化之 Word(中)

    1. 前言 上一篇文章,对 Word 写入数据的一些常见操作进行了总结 最全总结 | 聊聊 Python 办公自动化之 Word(上) 相比写入数据,读取数据同样很实用! 本篇文章,将谈谈如何全面读取 ...

  9. 最全总结 | 聊聊 Python 办公自动化之 PPT(中)

    1. 前言 上一篇文章简单地介绍了 PPT 的文档结构,并使用 python-pptx 这个依赖库完成对 PPT 文档最基本的操作 最全总结 | 聊聊 Python 办公自动化之 PPT(上) 作为 ...

随机推荐

  1. RabbitMQ for CentOS安装教程

    一.下载并安装Erlang 下载地址:http://www.erlang.org/downloads otp_src_20.3.tar.gz ①解压otp_src_20.3.tar.gz ②安装各种驱 ...

  2. windows7命令行终端获取管理员模式随笔

    非常感谢http://wenku.baidu.com/view/d0e8d2d2240c844769eaee8a.html 背景: 安装了windows7系统后发现有很多命令在命令行模式下运行不了说没 ...

  3. Python数值计算之插值曲线拟合-01

        3 插值与曲线拟合 Interpolation and Curve Fitting 给定n+1个数据点(xi,yi), i = 0,1,2,…,n,评估y(x). 3.1 介绍(introdu ...

  4. java删除文件操作代码备忘

    /** * 删除目录下的所有文件及其自身 * @param file */ private static void deleteFile(File file) { if (file.exists()) ...

  5. centos 7 秘钥分发

    生成秘钥 [root@node1 ~]# ssh-keygen 查看秘钥 [root@node1 ~]# ls .ssh/id_rsa* .ssh/id_rsa .ssh/id_rsa.pub 将秘钥 ...

  6. WTL中最简单的实现窗口拖动的方法(转)

    目前,很多基于对话框的应用程序中对话框都是不带框架的,也就是说对话框没有标题栏.众所周知,窗口的移动都是通过鼠标拖动窗口的标题栏来实现的,那么现在应用程序中的对话框没有了标题栏,用户如何移动对话框呢? ...

  7. 模拟一个带背景的 TPanel

    https://www.cnblogs.com/del/archive/2008/09/01/1281345.html

  8. delphi StringGrid 表格的复制粘贴

    //参考如下代码--uses Clipbrd; function StringGridSelectText(mStringGrid: TStringGrid): string;var  I, J: I ...

  9. android:ViewHolder模式

    ViewHolder holder = null; if(convertView == null){ convertView = mInflater.inflate(R.layout.xxx null ...

  10. 怎样使用ZOL一键安装器下载中关村在线的源安装包

    怎样使用ZOL一键安装器下载中关村在线的源安装包 马根峰               (广东联合电子服务股份有限公司, 广州 510300) 摘要    中关村在线近期開始推出ZOL一键安装器,用户直 ...