为什么整数在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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/527414.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL中序列的作用_MySql中序列的应用和总结

Mysql中的序列主要用于主键,主键是递增的字段,不可重复。Mysql与Oracle不同的是,它不支持原生态的sequence,需要用表和函数的组合来实现类似序列的功能。1.首先创建序列的主表/*Navicat Premium Data TransferSource Server : MyS…

python内置模块重要程度排名_python常用内置模块

#持续更新#在使用内置模块的时候需要导入,例如import abc,则导入abc模块,当然模块也可以自己写,相当于一个类,后面放到类里说,这个因为环境闲置,有些无法执行,只能理解了#os系统操作…

路由器装上去没有网络_5G网络那么快,今后路由器没有存在的价值了?

从一些宣传来看,即将商用的5G网速确实很快,号称10Gbps,比有线宽带还要快。既然5G网速那么快了,还有必要装宽带和路由器吗?先来纠正一个误区,5G网络的理论速度与实际速度是有很大差别的!!目前很多宣传中所说的5G网速最…

python爬取新闻网站内容findall函数爬取_Python爬取新闻网标题、日期、点击量

最近接触Python爬虫,以爬取学校新闻网新闻标题、日期、点击量为例,记录一下工作进度目前,感觉Python爬虫的过程无非两步:Step1.获取网页url(利用Python库函数import urllib2)Step2.利用正则表达式对html中的字符串进行匹配、查找等…

python token发送请求_python发送requests请求时,使用登录的token值,作为下一个接口的请求头信息...

python发送requests请求时,使用登录的token值,作为下一个接口的请求头信息登录接口代码:在这里插入图片描述登陆后返回的结果是:在这里插入图片描述新增渠道接口:新增渠道接口需要在headers中添加登陆后返回的token才可…

python绘制散点图的步骤_python如何绘制散点图?

饼图:饼图显示静态数字以及类别如何表示整体构成的一部分。饼图以百分比表示数字,所有段的总和需要等于100%。plt.pie(df[Age], labels {"A", "B", "C","D", "E", "F","G…

numpy支持比python更多的数据类型_NumPy数据类型

NumPy - 数据类型NumPy 支持比 Python 更多种类的数值类型。 下表显示了 NumPy 中定义的不同标量数据类型。序号数据类型及描述1.bool_存储为一个字节的布尔值(真或假)2.int_默认整数,相当于 C 的long,通常为int32或int643.intc相当于 C 的int&#xff0…

suse11安装python_suse linux 安装python Eric4

1. Install Qt42. Build and install sip3. Build and install QScintilla24. Build and install PyQt45. Build and install QScintilla2 Python bindings6. Install eric4这个文件在eric4-4.4.9/README1.安装python2.62.安装qt4解压 qt-everywhere-opensource-src-4.7.1./con…

coap python3_node-coap入门(三)——Observe

示例调用v0.12.0版本的node-coap,目前只能在server端通过res.end()触发finish事件,client端目前还没实现响应API。但火狐copper插件取消订阅时,server端可以触发finish事件。发现client取消订阅API的读者若能与我交流分享,不甚感激…

怎么把程序内部坐标转为屏幕坐标_经纬度坐标转换成屏幕坐标

地理坐标定义规则:X轴(代表经度)向右递增,Y轴(纬度)向上递增,就好比小学学过的平面坐标。向左、向下的规则。 屏幕坐标定义规则:X轴向右递增,Y轴向下递增。可以看出,地理坐标和屏幕坐标的区别仅仅只是在于Y…

kmeans python_k-means python实践

#codingutf-8import numpy as npimport matplotlib.pyplot as pltfrom sklearn.cluster import KMeansimport sklearn.datasets as dsimport matplotlibmatplotlib.rcParams[font.sans-serif] [uSimHei]matplotlib.rcParams[axes.unicode_minus] False#生成测试数据#生成维度…

mysql max 命令大全_MySQL常用命令,34道练习题(持续更新中)。

1、使用SHOW语句找出在服务器上当前存在什么数据库:mysql> SHOW DATABASES;2、创建一个数据库MYSQLDATAmysql> CREATE DATABASE MYSQLDATA;3、选择你所创建的数据库mysql> USE MYSQLDATA; (按回车键出现Database changed 时说明操作成功!)4、查…

python深度优先_python数据结构之图深度优先和广度优先实例详解

本文实例讲述了python数据结构之图深度优先和广度优先用法。分享给大家供大家参考。具体如下:首先有一个概念:回溯回溯法(探索与回溯法)是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先…

mysql sum id 5_mysql怎么使用sum()求id字段的和?

mysql使用sum()求id字段的和的方法:利用“SELECT SUM(id) FROM 数据表名;”来求id字段的和,返回id字段值的总和;SUM()函数在计算时,忽略列值为NULL的行。(推荐教程:mysql视频教程)SUM() 函数返回数值列的总数。SQL SUM…

python问卷调查系统设计案例_从设计到施工,全面剖析超级玻璃屋面系统案例!...

【设计师的材料清单】戳图即可购买《设计师的材料清单》实体书或获取高清电子书转载整理自:弗思特(ID:FFTCCL)各位设计师大家好!随着人们对建筑外观及内部环境要求的不断提高具有大面积采光且轻盈的玻璃屋面系统在大型公共建筑设计中被广泛使…

mysql如何建外建_mysql如何建立外键

mysql如何建立外键一个主表blog博客表,DROP TABLE IF EXISTS blog;CREATE TABLE blog (id int(11) NOT NULL auto_increment,title varchar(11) default NULL,content varchar(11) default NULL,PRIMARY KEY (id)) ENGINEInnoDB DEFAULT CHARSETgb2312;另一个表comment,评论表…

二叉树的建立与遍历完整代码_腾讯面试官这样问我二叉树,我刚好都会

前记上周我投递出了简历,岗位是后端开发工程师。这周腾讯面试官给我进行了视频面试。面试过程中他问了二叉树的问题。二叉树相关算法题,在面试中出现的次数非常非常多,所以我面试之前也有所准备。今天结合面试问题详细讲一讲二叉树&#xff0…

python教程程序_Python如何发布程序的详细教程

如何发布一个Python程序:1.安装一个pyInstaller在pycharm里点 file —–>setting—–>Project workspace——>Interpreter——>点pip右边的+号,进入下面这个界面:搜索pyInstaller, 点击左下方Iinstall package安装(出…

创建mysql数据库图解_mysql数据库怎么创建外键?(图文+视频)

本篇文章主要给大家介绍mysql数据库怎么创建外键。关于mysql数据库外键的基础介绍,我们在这篇文章【Mysql外键是什么?有哪些用处?】中,已经给大家介绍过了,需要的朋友可以选择参考。了解了外键的基础定义,那…

redis 管理工具_Redis桌面管理工具Redis Desktop Manager 2019.2发布

简介Redis桌面管理器(又名RDM) - 是适用于Windows,Linux和MacOS的快速开源Redis数据库管理应用程序。该工具为您提供了一个易于使用的GUI,可以访问您的Redis数据库并执行一些基本操作:将键视为树,CRUD键,通过shell执行…