对Python中小整数对象池和大整数对象池的使用详解


Posted in Python onJuly 09, 2019

1. 小整数对象池

整数在程序中的使用非常广泛,Python为了优化速度,使用了小整数对象池, 避免为整数频繁申请和销毁内存空间。

Python 对小整数的定义是 [-5, 256] 这些整数对象是提前建立好的,不会被垃圾回收。在一个 Python 的程序中,无论这个整数处于LEGB中的哪个位置,

所有位于这个范围内的整数使用的都是同一个对象。同理,单个字母也是这样的。

In [1]: a=-5

In [2]: b=-5

In [3]: a is b
Out[3]: True

In [4]: a=256

In [5]: b=256

In [6]: a is b
Out[6]: True

In [7]: a=1000

In [8]: b=1000

In [9]: a is b
Out[9]: False
intern机制处理空格一个单词的复用机会大,所以创建一次,有空格创建多次,但是字符串长度大于20,就不是创建一次了。
In [13]: a="abc"

In [14]: b="abc"

In [15]: a is b
Out[15]: True

In [16]: a="helloworld"

In [17]: b="helloworld"

In [18]: a is b
Out[18]: True

In [19]: a="hello world"

In [20]: b="hello world"

In [21]: a is b
Out[21]: False
 

s1 = "abcd"
s2 = "abcd"
print(s1 is s2)

s1 = "a" * 20
s2 = "a" * 20
print(s1 is s2)

s1 = "a" * 21
s2 = "a" * 21
print(s1 is s2)

s1 = "ab" * 10
s2 = "ab" * 10
print(s1 is s2)

s1 = "ab" * 11
s2 = "ab" * 11
print(s1 is s2)
# True
# True
# False
# True
# False

2.大整数对象池。说明:终端是每次执行一次,所以每次的大整数都重新创建,而在pycharm中,每次运行是所有代码都加载都内存中,属于一个整体,所以

这个时候会有一个大整数对象池,即处于一个代码块的大整数是同一个对象。c1 和d1 处于一个代码块,而c1.b和c2.b分别有自己的代码块,所以不相等。

C1.b is C2.b
In [22]: a=1000

In [23]: b=1000

In [24]: a is b
Out[24]: False

In [25]: a=-1888

In [26]: b=-1888

In [27]: a is b
Out[27]: False

In [28]: 
c1 = 1000
d1 = 1000
print(c1 is d1) # True

class C1(object):
  a = 100
  b = 100
  c = 1000
  d = 1000


class C2(object):
  a = 100
  b = 1000


print(C1.a is C1.b) # True
print(C1.a is C2.a) # True
print(C1.c is C1.d) # True
print(C1.b is C2.b) # False

以上这篇对Python中小整数对象池和大整数对象池的使用详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python的re模块正则表达式操作
May 25 Python
整理Python 常用string函数(收藏)
May 30 Python
Python搭建HTTP服务器和FTP服务器
Mar 09 Python
python实现二维插值的三维显示
Dec 17 Python
在python带权重的列表中随机取值的方法
Jan 23 Python
浅谈python中get pass用法
Mar 19 Python
PyQT5 QTableView显示绑定数据的实例详解
Jun 25 Python
树莓派安装OpenCV3完整过程的实现
Oct 10 Python
python中dict()的高级用法实现
Nov 13 Python
python matplotlib中的subplot函数使用详解
Jan 19 Python
Ubuntu 20.04安装Pycharm2020.2及锁定到任务栏的问题(小白级操作)
Oct 29 Python
pd.DataFrame中的几种索引变换的实现
Jun 16 Python
Python 旋转打印各种矩形的方法
Jul 09 #Python
python opencv对图像进行旋转且不裁剪图片的实现方法
Jul 09 #Python
python下的opencv画矩形和文字注释的实现方法
Jul 09 #Python
Python3 执行系统命令并获取实时回显功能
Jul 09 #Python
利用python开发app实战的方法
Jul 09 #Python
python设置环境变量的作用和实例
Jul 09 #Python
python版百度语音识别功能
Jul 09 #Python
You might like
PHP版国家代码、缩写查询函数代码
2011/08/14 PHP
ThinkPHP实现跨模块调用操作方法概述
2014/06/20 PHP
Yii2 rbac权限控制之rule教程详解
2016/06/23 PHP
php探针不显示内存解决方法
2019/09/17 PHP
tp5递归 无限级分类详解
2019/10/18 PHP
javascript 自动转到命名锚记
2009/01/10 Javascript
Javascript解决常见浏览器兼容问题的12种方法
2010/01/04 Javascript
jQuery遍历Form示例代码
2013/09/03 Javascript
jq实现酷炫的鼠标经过图片翻滚效果
2014/03/12 Javascript
推荐4个原生javascript常用的函数
2015/01/12 Javascript
WEB前端开发都应知道的jquery小技巧及jquery三个简写
2015/11/15 Javascript
ros::spin() 和 ros::spinOnce()函数的区别及详解
2016/10/01 Javascript
微信小程序 slider 详解及实例代码
2017/01/10 Javascript
利用javascript实现的三种图片放大镜效果实例(附源码)
2017/01/23 Javascript
Angularjs 动态添加指令并绑定事件的方法
2017/04/13 Javascript
bootstrap的工具提示实例代码
2017/05/17 Javascript
JS将网址url转化为JSON格式的方法
2018/07/02 Javascript
jQuery时间戳和日期相互转换操作示例
2018/12/07 jQuery
深入浅出 Vue 系列 -- 数据劫持实现原理
2019/04/23 Javascript
pm2发布node配置文件ecosystem.json详解
2019/05/15 Javascript
jquery操作select常见方法大全【7种情况】
2019/05/28 jQuery
JavaScript 扩展运算符用法实例小结【基于ES6】
2019/06/17 Javascript
简单的python后台管理程序
2017/04/13 Python
python如何实现内容写在图片上
2018/03/23 Python
解决pycharm每次新建项目都要重新安装一些第三方库的问题
2019/01/17 Python
Python从函数参数类型引出元组实例分析
2019/05/28 Python
基于python的selenium两种文件上传操作实现详解
2019/09/19 Python
python 实现的IP 存活扫描脚本
2020/12/10 Python
python gui开发——制作抖音无水印视频下载工具(附源码)
2021/02/07 Python
英国领先的电子、技术和办公用品购物网站:Ebuyer
2018/04/04 全球购物
什么是静态路由?什么是动态路由?各自的特点是什么?
2015/09/16 面试题
敏捷开发的主要原则都有哪些
2015/04/26 面试题
构建高效课堂实施方案
2014/03/13 职场文书
光信息科学与技术专业职业生涯规划
2014/03/13 职场文书
2014年党员自我评议对照检查材料
2014/09/20 职场文书
Python OpenCV实现图像模板匹配详解
2022/04/07 Python