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

liftword4个月前 (02-14)技术文章31

前面我们说了,只要是赋值操作,产生新的值的时候,都会申请一块内存空间。只要申请了新的内存空间,他的内存地址就会不一样,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 中如何将字符串转换为整数

类似于内置的 str() 方法,Python 语言中有一个很好用的 int() 方法,可以将字符串对象作为参数,并返回一个整数。用法示例:# Here age is a string object a...

一文掌握在 Python 中将字符串转换为浮点数或整数

本教程中将介绍如何在 Python 中使用内置float()、int()函数、literal_eval()函数等,将字符串转换为浮点数 float 或整数 int。在 Python 中将字符串转换为浮...

编写程序随机产生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编程学习系列:求平方根_python编写程序平方根

求平方根:sqrt(x) 返回数字x的平方根。例子:编写一个程序,快速的计算并输出1-20各个数的平方根:import math as m #导入math库并将其重新命名为mx=1 #设置计数器起始值...