我的Python学习笔记(一):==和is
Python中对象包含的三个基本要素:id(身份标识),type(数据类型),value(值)
- ==是用来比较两个对象的value(值)是否相等,
- is是用来比较两个对象的id(身份标识)是否相等
==示例:
x = y = [1, 2, 3]
z = [1, 2, 3]
print(x == y) # True
print(x == z) # True
print(x is y) # True
print(x is z) # False print(id(x)) #
print(id(y)) #
print(id(z)) #
- x,y,z三个对象的值都是[1,2,3],所以在==的情况下都是True
- x和y的id相同,所以x is y 为 True,而x和z的id不同,所以x is z 为 False
is示例:
一、整数对象
对于整数对象,Python把一些频繁使用的整数对象缓存起来,保存到一个叫small_ints的链表中,在Python的整个生命周期内,任何需要引用这些整数对象的地方,都不再重新创建新的对象,而是直接引用缓存中的对象。Python把这些可能频繁使用的整数对象规定在范围[-5, 256]之间的小对象放在small_ints中,但凡是需要用些小整数时,就从这里面取,不再去临时创建新的对象。
1、当整数对象在区间[-5,256]内时,is得到的结果是True(a,b的id值相同)
In [1]: a = 1
In [2]: b = 1
In [3]: print(a is b)
True
In [4]: print(id(a))
4414864752
In [5]: print(id(b))
4414864752
2、当整数对象不在区间[-5,256]内时,is得到的结果是False(a,b的id值不同)
In [6]: a = 257
In [7]: b = 257
In [8]: print(a is b)
False
In [9]: print(id(a))
4449527760
In [10]: print(id(b))
4449527536
3、看懂上面两个例子后,我们接着看以下代码:
c = 257 def test():
a = 257
b = 257
print(a is b) # True
print(a is c) # False
print(id(a)) #
print(id(b)) #
print(id(c)) # test()
如果按照第2点得出的结论,257不在区间[-5,256]内,那么两个的is结果都应该为False才对,可是为什么a is b却为True呢?
为了弄清楚这个问题,首先我们要先理解程序的代码块问题。Python程序由代码块构成,代码块作为程序的一个最小基本单位来执行。一个模块文件、一个函数体、一个类、交互式命令中的单行代码都叫做一个代码块。在上面这段代码中,由两个代码块构成,c = 257作为一个代码块,函数test作为另外一个代码块。Python内部为了将性能进一步的提高,凡是在一个代码块中创建的整数对象,如果存在一个值与其相同的对象于该代码块中了,那么就直接引用,否则创建一个新的对象出来。Python出于对性能的考虑,但凡是不可变对象,在同一个代码块中的对象,只有是值相同的对象,就不会重复创建,而是直接引用已经存在的对象。因此,不仅是整数对象,还有字符串对象也遵循同样的原则。所以 a is b就理所当然的返回True了,而c和a不在同一个代码块中,因此在Python内部创建了两个值都是257的对象。
注:如下图所示,在PyCharm中运行如下代码,得到的结果都为True,原因就是因为在同一代码块中,值相同的对象就不会重复创建,而是直接引用已经存在的对象
a = 1 # a和b为数值类型,在区间[-5,256]内
b = 1
print(a is b) # True
print(id(a)) #
print(id(b)) # a = 257 # a和b为数值类型,不在区间[-5,256]内
b = 257
print(a is b) # True
print(id(a)) #
print(id(b)) #
二、字符及字符串对象
当a,b为字符串对象时,python中有intern机制,它指的就是在创建一个新的字符串对象时,如果已经有了和它的值相同的字符串对象,那么就直接返回那个对象的引用,而不返回新创建的字符串对象。只包括字母数字下划线的字符串,python会对它们使用intern机制。(所以当字符串只包括字母数字下划线时,进行is操作返回True,如果包含其他字符,进行is操作则返回False)
a = "a_1" # a和b为字符串类型
b = "a_1"
print(a is b) # True
print(id(a)) #
print(id(b)) # a = "&" # a和b为字符串类型
b = "&"
print(a is b) # True
print(id(a)) #
print(id(b)) #
注:当a,b为单个字符对象时,进行is操作都返回True
三、其他类型对象
当a,b为元组,list,dict和set类型时,进行is操作结果为False
a = (1, 2, 3) # a和b为元组类型
b = (1, 2, 3)
print(a is b) # False
print(id(a)) #
print(id(b)) # a = [1, 2, 3] # a和b为list类型
b = [1, 2, 3]
print(a is b) # False
print(id(a)) #
print(id(b)) # a = {'is' : 1, 'equal' : 2} # a和b为dict类型
b = {'is' : 1, 'equal' : 2}
print(a is b) # False
print(id(a)) #
print(id(b)) # a = ([1, 2, 3]) # a和b为set类型
b = ([1, 2, 3])
print(a is b) # False
print(id(a)) #
print(id(b)) #
我的Python学习笔记(一):==和is的更多相关文章
- python学习笔记整理——字典
python学习笔记整理 数据结构--字典 无序的 {键:值} 对集合 用于查询的方法 len(d) Return the number of items in the dictionary d. 返 ...
- VS2013中Python学习笔记[Django Web的第一个网页]
前言 前面我简单介绍了Python的Hello World.看到有人问我搞搞Python的Web,一时兴起,就来试试看. 第一篇 VS2013中Python学习笔记[环境搭建] 简单介绍Python环 ...
- python学习笔记之module && package
个人总结: import module,module就是文件名,导入那个python文件 import package,package就是一个文件夹,导入的文件夹下有一个__init__.py的文件, ...
- python学习笔记(六)文件夹遍历,异常处理
python学习笔记(六) 文件夹遍历 1.递归遍历 import os allfile = [] def dirList(path): filelist = os.listdir(path) for ...
- python学习笔记--Django入门四 管理站点--二
接上一节 python学习笔记--Django入门四 管理站点 设置字段可选 编辑Book模块在email字段上加上blank=True,指定email字段为可选,代码如下: class Autho ...
- python学习笔记--Django入门0 安装dangjo
经过这几天的折腾,经历了Django的各种报错,翻译的内容虽然不错,但是与实际的版本有差别,会出现各种奇葩的错误.现在终于找到了解决方法:查看英文原版内容:http://djangobook.com/ ...
- python学习笔记(一)元组,序列,字典
python学习笔记(一)元组,序列,字典
- Pythoner | 你像从前一样的Python学习笔记
Pythoner | 你像从前一样的Python学习笔记 Pythoner
- OpenCV之Python学习笔记
OpenCV之Python学习笔记 直都在用Python+OpenCV做一些算法的原型.本来想留下发布一些文章的,可是整理一下就有点无奈了,都是写零散不成系统的小片段.现在看 到一本国外的新书< ...
- python学习笔记(五岁以下儿童)深深浅浅的副本复印件,文件和文件夹
python学习笔记(五岁以下儿童) 深拷贝-浅拷贝 浅拷贝就是对引用的拷贝(仅仅拷贝父对象) 深拷贝就是对对象的资源拷贝 普通的复制,仅仅是添加了一个指向同一个地址空间的"标签" ...
随机推荐
- 天津政府应急系统之GIS一张图(arcgis api for flex)解说(三)显示地图坐标系模块
config.xml文件的配置例如以下: 1 2 <widget left="3" bottom="3" config="widgets/Coo ...
- Object-C与Swift混合开发
Object-C作为Apple的iOS App开发语言服务了很多个年头,2014年Apple推出了新的编程语言Swift.更高效更安全的口号再次吸引了一大批非iOS开发程序猿进入,小编觉得Swift代 ...
- Maven构建真正的J2EE项目
今天同事问起我眼下用Maven构建的多模块项目架构和曾经用Eclipse创建的Web项目的问题.以下将讲一下使用maven搭建多模块的J2ee项目,以及採用这样的方式搭建项目对日后项目的水平拆分和垂直 ...
- Codeforces 29D Ant on the Tree 树的遍历 dfs序
题目链接:点击打开链接 题意: 给定n个节点的树 1为根 则此时叶子节点已经确定 最后一行给出叶子节点的顺序 目标: 遍历树并输出路径.要求遍历叶子节点时依照给定叶子节点的先后顺序訪问. 思路: 给每 ...
- 【CODEFORCES】 A. Dreamoon and Sums
A. Dreamoon and Sums time limit per test 1.5 seconds memory limit per test 256 megabytes input stand ...
- 游戏AI(三)—行为树优化之基于事件的行为树
上一篇我们讲到了关于行为树的内存优化,这一篇我们将讲述行为树的另一种优化方法--基于事件的行为树. 问题 在之前的行为树中,我们每帧都要从根节点开始遍历行为树,而目的仅仅是为了得到最近激活的节点,既然 ...
- 原来你是这样的JAVA[01]-基础一瞥
1.Java是什么呢? Java不仅是一门语言,而且是一个完整的平台,有一个庞大的库,其中包含了很多可重用的代码和一个提供安全性.跨操作系统的可移植性以及自动垃圾收集等服务的执行环境. 2.JDK 和 ...
- TextMesh Pro Emoji Align With Text(表情和文字对齐)
前言 MMO游戏中需要富文件组件,大体功能包括图文混排,表情,超链接,文字动画等富文本功能,且DC数占用少. 本文选择Unity免费提供的TextMesh Pro 解决方案. 软件环境 Unity3D ...
- 如何导入外部的源码到eclipse中
用struts,spring等框架开发也有两年的时间了,一直很少去阅读其源码,每次在eclipse编码的过程中想要看某一个类的源码,ctrl点击总是出现source not found的提示,也没有去 ...
- select的限制以及poll的使用
1.先说select在多路IO中的限制:1)linux中每个程序能够打开的最多文件描述符是有限制的.默认是1024.可以通过ulimit -n进行查看和修改: xcy@xcy-virtual-mach ...