完全理解Python的 '==' 和 'is'
'==' 比较的是两个对象的值
'is' 比较的是两个对象的内存地址(id)
下面我们着重理解 'is'。对于这个,我们需要知道:小整数对象池,大整数对象池,以及intern机制
小整数池:Python预先创建小整数缓存池—— [-5~256],无论创建多少个对象,都是指向同一个地址,这样是为了避免小整数频繁申请和释放内存。
>>> a=
>>> b=
>>> a is b
True
>>> + is
True >>> a=1.0
>>> b=1.0
>>> a is b
False
大整数对象池:Python 提供了一个可扩展的内存空间,也叫通用整数对象池,谁需要用就给谁用,免去了申请内存。这个空间是一个PyIntBlock结构,是用一个单向列表连接一串内存(block),这个列表由 block_list 维护,而每个 block 维护一个 整数对象数组(Objects),用于存放被缓存的整数对象,即处于一个内存(block)的大整数是同一个对象。
>>> def func():
... a=10.1
... b=10.1
... return a is b
...
>>> func()
True
a和b的赋值都是由同一个通用整数池项获得的。
intern机制:Python的字符串类型中有一个 interned,它是一个记录字符串对象的字典,以此来保证这些字符串在内存中的唯一,相同值的字符串会使用同一个对象。
但是,只对由字母、数字、下划线组成的字符串做intern处理,而存在其他字符的字符串则不会。
>>> a='abc'
>>> b='abc'
>>> a is b
True >>> a='ab c'
>>> b='ab c'
>>> a is b
False
此外,Python其他的数据类型如字典(dict)、列表(list)、集合(set)等,都是创建不同的对象
>>> a=[,,]
>>> b=[,,]
>>> a is b
False
>>> a={'a':1}
>>> b={'a':1}
>>> a is b
False
>>>
补充一个,下面这种情况是因为上一个 [1,2,3]被回收了,在新建[4,5,6]时那片缓存又被用到了
>>> id([,,]) == id([,,])
True
>>> id([,,])
36200264L
>>> id([,,])
36200264L
完全理解Python的 '==' 和 'is'的更多相关文章
- 用一个简单的例子来理解python高阶函数
============================ 用一个简单的例子来理解python高阶函数 ============================ 最近在用mailx发送邮件, 写法大致如 ...
- 【转】你真的理解Python中MRO算法吗?
你真的理解Python中MRO算法吗? MRO(Method Resolution Order):方法解析顺序. Python语言包含了很多优秀的特性,其中多重继承就是其中之一,但是多重继承会引发很多 ...
- 理解 python metaclass使用技巧与应用场景分析
理解python metaclass使用技巧与应用场景分析 参考: decorator与metaclass:http://jfine-python-classes.readthedocs. ...
- 理解Python中的装饰器
文章先由stackoverflow上面的一个问题引起吧,如果使用如下的代码: @makebold @makeitalic def say(): return "Hello" 打印出 ...
- 深入理解 Python 异步编程(上)
http://python.jobbole.com/88291/ 前言 很多朋友对异步编程都处于"听说很强大"的认知状态.鲜有在生产项目中使用它.而使用它的同学,则大多数都停留在知 ...
- 理解Python中的装饰器//这篇文章将python的装饰器来龙去脉说的很清楚,故转过来存档
转自:http://www.cnblogs.com/rollenholt/archive/2012/05/02/2479833.html 这篇文章将python的装饰器来龙去脉说的很清楚,故转过来存档 ...
- 一步一步理解 python web 框架,才不会从入门到放弃
要想清楚地理解 python web 框架,首先要清楚浏览器访问服务器的过程. 用户通过浏览器浏览网站的过程: 用户浏览器(socket客户端) 3. 客户端往服务端发消息 6. 客户端接收消息 7. ...
- 完全理解 Python 迭代对象、迭代器、生成器(转)
完全理解 Python 迭代对象.迭代器.生成器 本文源自RQ作者的一篇博文,原文是Iterables vs. Iterators vs. Generators » nvie.com,俺写的这篇文章是 ...
- 如何理解Python装饰器
如何理解Python装饰器?很多学员对此都有疑问,那么上海尚学堂python培训这篇文章就给予答复. 一.预备知识 首先要理解装饰器,首先要先理解在 Python 中很重要的一个概念就是:“函数是 F ...
- 理解Python闭包概念
闭包并不只是一个python中的概念,在函数式编程语言中应用较为广泛.理解python中的闭包一方面是能够正确的使用闭包,另一方面可以好好体会和思考闭包的设计思想. 1.概念介绍 首先看一下维基上对闭 ...
随机推荐
- 北京Uber优步司机奖励政策(4月5日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- 北京Uber优步司机奖励政策(3月17日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- JAVA FILE.renameTo跨文件系统移动文件失败
遇到了FILE.renameTo跨文件系统移动文件失败的问题,应使用FILES.move()接口或在同一文件系统移动文件. FILE.renameTo接口说明: public boolean rena ...
- redhat防火墙管理
systemctl status firewalldsystemctl stop firewalldsystemctl start firewalldsystemctl enable firewall ...
- ACID、数据库隔离级别
ACID: A(Atomicity):原子性,要么全部执行,要么都不执行 C(consistency):一致性: 特点: 1.一个操作除法级联,这些必须成功,否则全部失败(原子性) 2.所有节点同步更 ...
- 「日常训练」Brackets in Implications(Codeforces Round 306 Div.2 E)
题意与分析 稍微复杂一些的思维题.反正这场全是思维题,就一道暴力水题(B).题解直接去看官方的,很详尽. 代码 #include <bits/stdc++.h> #define MP ma ...
- .NET邮件发送详情
①百度下载个Free Smtp Server ②下载完成后,打开进去,点击左上角的options,弹出窗口,进行如下图选项即可(一般默认已正确选中),然后我们可以把这软件关了. (下次你重启电脑时,也 ...
- Python 关键字参数和可变参数
关键字参数 如果你有一些具有许多参数的函数,而你又希望只对其中的一些进行指定,那么你可以通过命名它们来给这些参数赋值——这就是python关键字参数(Keyword Arguments)——我们使用命 ...
- [USACO09Open] Tower of Hay 干草塔
为了调整电灯亮度,贝西要用干草包堆出一座塔,然后爬到牛棚顶去把灯泡换掉.干草包会从传送带上运来,共会出现N包干草,第i包干草的宽度是W i ,高度和长度统一为1.干草塔要从底层开始铺建.贝西会选择最先 ...
- 【Set jsonObj = toJson( jsonString )】创建JSON实例
创建JSON实例: 原型: toJson( jsonString ) 说明: 创建JSON实例 返回: [JSON] 参数: jsonString [可选] 可以用json格式字符串创建实例 示例: ...