为什么整数在python中表示d_python中整数的缓存机制
在python中,如下代码结果一定不会让你吃惊:
Python 3.3.2 (v3.3.2:d047928ae3f6, May 16 2013, 00:06:53) [MSC v.1600 64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> a=345
>>> b=a
>>> a is b
True
>>>
没错,在python一切皆是对象,而对象是通过引用传递的。在赋值时,不管这个对象是新创建的,还是一个已经存在的,都是将该对象的引用赋值给变量。故这里a实际上和b是同一个对象,a is b为true!
当然稍为了解python的人我相信都会知道以上相关知识的。但是如下的代码结果,却让人不大好理解了:
>>> c=256
>>> d=256
>>> c is d
True
>>> e=257
>>> f=257
>>> e is f
False
>>>
我们将c赋值为了整型值256,d也为256,e为257,f为257。但是当把c与d,e与f进行is操作时,却发现两者的结果不同。
原因在哪?
——这个是由python中的整型对象的缓冲池机制,所决定的。
在python中几乎所有的内建对象,都会有自己所特有的对象池机制。
1. 小整数对象——小整型对象池
在实际编程中,数值比较小的整数,比如1,2,29等,可能会非常频繁的出现。而在python中,所有的对象都存在与系统堆上。想想?如果某个小整数出现的次数非常多,那么python将会出现大量的malloc/free操作,这样大大降低了运行效率,而且会造成大量的内存碎片,严重影响Python的整体性能。
在python2.5乃至3.3中,将小整数位于[-5,257)之间的数,缓存在小整型对象池中。
这也就是为了c is d而e is not f的原因了。
2. 大整数对象——通用整数对象池
由以上知,python把小整型数完全的缓存在了小对象缓存池中了。而那些大整数对象就没有那么好的待遇了!python运行环境提供了一块内存空间供大整数轮流使用。通常称为通用整数对象池。这也就是说大整数其实也是有缓存的。该对象池使用链表组织,虽然e和f有着相同的值,但是在链表中确是不同的节点。也就是说e和f根本不是一个对象。至于既然有缓存,为什么e和f还要组织为两个节点,就不大明白了。
讲讲我的看法吧:我觉得从语义上来讲e=257和f=257本身就是应当为两个不同的对象(这点和对象赋值不同)。由于整数缓存池的存在,让大家觉得任何整数在缓冲池中都只能存在一个,不能重复。但将e和f在整数缓冲池中组织为一个节点或两个节点没有什么本质区别吧(除了浪费了一点内存)。
本人享有博客文章的版权,转载请标明出处http://blog.csdn.net/baidu20008
为什么整数在python中表示d_python中整数的缓存机制相关推荐
- python整数类型-Python 的数值类型(整数、长整数、浮点数和复数)
在Python中有4种类型的数--整数.长整数.浮点数和复数. 2是一个整数的例子. 长整数不过是大一些的整数. 3.23和52.3E-4是浮点数的例子.E标记表示10的幂.在这里,52.3E-4表示 ...
- python整数池_【Python】Python中神奇的小整数对象池和大整数对象池
小整数对象池 整数在程序中的使用非常广泛,Python为了优化速度,使用了小整数对象池, 避免为整数频繁申请和销毁内存空间. Python 对小整数的定义是 [-5, 256] 这些整数对象是提前建立 ...
- python缓存技术_Python中整数的缓存机制讲解
在python中,如下代码结果一定不会让你吃惊: Python 3.3.2 (v3.3.2:d047928ae3f6, May 16 2013, 00:06:53) [MSC v.1600 64 bi ...
- python输入整数_Python中实现输入一个整数的案例
我就废话不多说了,大家还是直接看代码吧!Y76免费资源网 #! usr/bin/python3.5 # -*- coding:utf-8 -*- a = input("请输入一个整数:&qu ...
- 【240】python 一个二维数组和一个整数,判断数组中是否含有该整数
♣ 题目部分(原文见公众号:python宝) python宝: https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=MzU5Nj ...
- python实现输入一个正整数_Python中实现输入一个整数的案例
我就废话不多说了,大家还是直接看代码吧! #! usr/bin/python3.5 # -*- coding:utf-8 -*- a = input("请输入一个整数:") #py ...
- 利用python解决Origin中十六进制和十进制整数转换的问题
利用python解决Origin中十六进制和十进制整数转换的问题 Origin是由OriginLab公司开发的一个科学绘图.数据分析软件,功能非常强大,可以画出各种漂亮的图像,而且还能进行数理统计/数 ...
- python字符串索引必须是整数_TypeError:在Python中,字符串索引必须是整数
我想从currency converter API得到的Json响应中获取key和value,得到一个错误:"of string index must be integers".下 ...
- 关于python字典以下选项中描述错误的是_关于 Python 对文件的处理,以下选项中描述错误的是_学小易找答案...
[单选题]小花最近疯狂迷恋李佳琦的推销产品,在李佳琦的广告营销下,小花兴致冲冲的买下来一只某牌口红,回来后却发现不适合自己,扔在一边闲置.根据消费者性格划分属于哪种购买行为? [单选题]采用邀请招标方 ...
最新文章
- JOptionPane
- linux sort -w32,WIN32汇编: 31.列表视图控件
- Chrome安装Vue.js devtool 4.1.4_0
- NYOJ--218--Dinner(含题目意思)
- 深度学习:未来机器人的进化途径
- 关于编程等宽字体 Cascadia Code
- html5上传steam,Steam.html · savfile/shencore.github.io - Gitee.com
- word论文公式加点
- python实现ks算法_Python计算KS值并绘制KS曲线
- 12306崩了,90%的人都用过这三款抢票工具
- 脑肿瘤的影像组学:图像评估、定量特征描述和机器学习方法
- 电影html css页面,纯CSS3构建的电影屏幕效果
- 在springboot整合mybatis遇到的数据库连接不上问题解决
- 90%老手的都不知道,Python异常还能写得如此优雅!
- 【历史上的今天】8 月 5 日:微信 5.0 发布;百度上市;LinkedIn 创始人诞生
- 《Windows程序设计》读书笔十 菜单和其他资源
- cad坐标归零lisp_求助,提取坐标的x值、y值不对,请问怎么修改
- ecmall 学习记录
- 手写简化版数据库--MYDB
- 解决win7可以上网但是网络图标显示未连接
热门文章
- 阿里云全球首推流量型独享虚拟主机新规格,网络访问速度最高提升400%
- Java小白进阶笔记(1)-重新认识Java
- 年终福利 | “社区之星”(社区核心贡献者)成长故事征集
- 大神如何一招完美解决Hadoop集群无法正常关闭的问题!| 博文精选
- 设置android应用闪屏图片_Android实现启动页面(闪屏页面)
- esclip直接快捷键构造函数_史上最全IntelliJ IDEA mac版快捷键文档
- python怎么把列表转换成字符串_如何将字节列表(unicode)转换为Python字符串?
- oracle用户编辑文件中文乱码
- 三、项目经理的角色【PMP 】
- RabbitMQ 手动签收