在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中整数的缓存机制相关推荐

  1. python整数类型-Python 的数值类型(整数、长整数、浮点数和复数)

    在Python中有4种类型的数--整数.长整数.浮点数和复数. 2是一个整数的例子. 长整数不过是大一些的整数. 3.23和52.3E-4是浮点数的例子.E标记表示10的幂.在这里,52.3E-4表示 ...

  2. python整数池_【Python】Python中神奇的小整数对象池和大整数对象池

    小整数对象池 整数在程序中的使用非常广泛,Python为了优化速度,使用了小整数对象池, 避免为整数频繁申请和销毁内存空间. Python 对小整数的定义是 [-5, 256] 这些整数对象是提前建立 ...

  3. python缓存技术_Python中整数的缓存机制讲解

    在python中,如下代码结果一定不会让你吃惊: Python 3.3.2 (v3.3.2:d047928ae3f6, May 16 2013, 00:06:53) [MSC v.1600 64 bi ...

  4. python输入整数_Python中实现输入一个整数的案例

    我就废话不多说了,大家还是直接看代码吧!Y76免费资源网 #! usr/bin/python3.5 # -*- coding:utf-8 -*- a = input("请输入一个整数:&qu ...

  5. 【240】python 一个二维数组和一个整数,判断数组中是否含有该整数

    ♣ 题目部分(原文见公众号:python宝) python宝: https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=MzU5Nj ...

  6. python实现输入一个正整数_Python中实现输入一个整数的案例

    我就废话不多说了,大家还是直接看代码吧! #! usr/bin/python3.5 # -*- coding:utf-8 -*- a = input("请输入一个整数:") #py ...

  7. 利用python解决Origin中十六进制和十进制整数转换的问题

    利用python解决Origin中十六进制和十进制整数转换的问题 Origin是由OriginLab公司开发的一个科学绘图.数据分析软件,功能非常强大,可以画出各种漂亮的图像,而且还能进行数理统计/数 ...

  8. python字符串索引必须是整数_TypeError:在Python中,字符串索引必须是整数

    我想从currency converter API得到的Json响应中获取key和value,得到一个错误:"of string index must be integers".下 ...

  9. 关于python字典以下选项中描述错误的是_关于 Python 对文件的处理,以下选项中描述错误的是_学小易找答案...

    [单选题]小花最近疯狂迷恋李佳琦的推销产品,在李佳琦的广告营销下,小花兴致冲冲的买下来一只某牌口红,回来后却发现不适合自己,扔在一边闲置.根据消费者性格划分属于哪种购买行为? [单选题]采用邀请招标方 ...

最新文章

  1. JOptionPane
  2. linux sort -w32,WIN32汇编: 31.列表视图控件
  3. Chrome安装Vue.js devtool 4.1.4_0
  4. NYOJ--218--Dinner(含题目意思)
  5. 深度学习:未来机器人的进化途径
  6. 关于编程等宽字体 Cascadia Code
  7. html5上传steam,Steam.html · savfile/shencore.github.io - Gitee.com
  8. word论文公式加点
  9. python实现ks算法_Python计算KS值并绘制KS曲线
  10. 12306崩了,90%的人都用过这三款抢票工具
  11. 脑肿瘤的影像组学:图像评估、定量特征描述和机器学习方法
  12. 电影html css页面,纯CSS3构建的电影屏幕效果
  13. 在springboot整合mybatis遇到的数据库连接不上问题解决
  14. 90%老手的都不知道,Python异常还能写得如此优雅!
  15. 【历史上的今天】8 月 5 日:微信 5.0 发布;百度上市;LinkedIn 创始人诞生
  16. 《Windows程序设计》读书笔十 菜单和其他资源
  17. cad坐标归零lisp_求助,提取坐标的x值、y值不对,请问怎么修改
  18. ecmall 学习记录
  19. 手写简化版数据库--MYDB
  20. 解决win7可以上网但是网络图标显示未连接

热门文章

  1. 阿里云全球首推流量型独享虚拟主机新规格,网络访问速度最高提升400%
  2. Java小白进阶笔记(1)-重新认识Java
  3. 年终福利 | “社区之星”(社区核心贡献者)成长故事征集
  4. 大神如何一招完美解决Hadoop集群无法正常关闭的问题!| 博文精选
  5. 设置android应用闪屏图片_Android实现启动页面(闪屏页面)
  6. esclip直接快捷键构造函数_史上最全IntelliJ IDEA mac版快捷键文档
  7. python怎么把列表转换成字符串_如何将字节列表(unicode)转换为Python字符串?
  8. oracle用户编辑文件中文乱码
  9. 三、项目经理的角色【PMP 】
  10. RabbitMQ 手动签收