18、零基础Python到全栈-小整数池的概念

liftword3个月前 (02-14)技术文章20

前面我们说了,只要是赋值操作,产生新的值的时候,都会申请一块内存空间。只要申请了新的内存空间,他的内存地址就会不一样,id也会不一样。

现在我定义a=10,b=10,按照我们前面分析的,这两串代码一运行,肯定申请两块内存空间把值丢进去然后分别绑定给这两个变量a和b。所以它们的id肯定不一样。

我们先来看a的id号,注意在Python的交互式环境里,敲回车之后,代码会立即执行,并且会直接把结果展示出来。所以这里不用print也能看到结果。

再来看b的id号。

这又是什么情况,为什么两个id号又变成一模一样的了?是不是这个傻逼老师在骗我?

再用is看一下,是不是True?居然还是True!按照我们前面分析的这两个id号不可能一样啊!

现在我们分析一下,申请内存空间,把值存进去,这就是一种写操作,就是前面讲引荐基础的时候我们说的io操作,不管是往硬盘里面读数据还是往内存里写数据这都叫io操作。

前面我们也说了,cpu的运算速度是相当快的,比内存的读写速度快,比硬盘的读写速度更快,所以一旦你的程序里有了io操作,就会拖慢了你的cpu的速度。所以python就帮我们做了一步优化叫小整数池。

为了避免因创建相同的值,而重复申请内存空间所带来的效率,Python解释器会在启动那一刻开始创建小整数池。范围是-5到256。就是只要Python解释器一启动,就立马申请一堆内存空间,把这些值放进去。

这些整数在我们写程序的过程中太常见了所以Python给我们做了优化,这个范围内的小整数被重复使用时,就不会再申请新的内存空间。而这些小整数永远不会被垃圾回收机制回收。

我们再来看,c=5+5,这样c=10了,然后再打印id(c),结果c的id号就和a和b的id号一样。所以说只要你程序运行过程中产生了10这个值。它就不会再去给你申请新的内存空间造一个新的值出来了,它会直接使用现成的。这样对你程序运行的效率就是一种提升。

刚刚说了小整数池的范围-5到256,留个课后作业,现在定一两个变量a=257,b=257。看看他们的两个id号是不是一样的!

相关文章

Python如何判断一个数是不是整数?答案没那么简单

在Python里,如果我们想判断一个数是不是整数,应该如何操作呢?使用type方法很多人首先想到的是使用type方法,例如:x = 0 type(x) == int这个方法看上去很简单,但在Pytho...

编写程序随机产生30个1-100之间的随机整数,按5行6列的格式输出

大家好,我是皮皮。一、前言前几天在某乎上看到了一个粉丝提问,编写程序,随机产生30个1-100之间的随机整数并存入5行6列的二维列表中,按5行6列的格式输出?这里拿出来跟大家一起分享下。二、实现过程后...

Python ‘bufferobject.c’整数溢出漏洞

受影响系统:Python python不受影响系统:Python python ˂ 2.7.8描述:BUGTRAQ ID: 70089Python是一种面向对象、直译式计算机程序设计语言。Python...

python编程:判断一个正整数是奇数还是偶数

#判定一个数为奇数还是偶数#if条件判定number = eval (input("请任意输入一个正整数:")) #eval 执行一个字符串表达式,并且返回一个值if number %2 == 0:...

「Python条件结构」if…else实现判断整数是否能不3和5整除

功能要求编写一个控制台应用程序,输入一个整数,判断它是否能同时被3和5整除,如能被整除则打印该数,显示“此数不能同时被3和5整除!”。实例代码num = int(input("请输入一个整数:"))i...