python中的变量内存以及关于is==、堆栈、 |
您所在的位置:网站首页 › 堆栈工作 › python中的变量内存以及关于is==、堆栈、 |
python 中的变量内存以及关于 is== 、堆栈、 在⼯作学习中会碰到⼀些 python 中变量与内存层⾯的问题理解,虽然是在不断的解决,但是并没有做过这⽅⾯的总结。 变量:⽤来标识 (identify) ⼀块内存区域。为了⽅便表⽰内存,我们操作变量实质上是在操作变量指向的那块内存单元。编译器负责分配。我 们可以使⽤ Python 内建函数 id() 来获取变量的地址 变量名:是⼀个标识符 (dientify) ,⽤来代之⼀块内存空间,使⽤这个变量名,我们可以很⽅便的操作这块内存区域。 内存:内存是我们电脑硬件,⽤来存放数据,形象的理解就是内存有⼀个⼀个的⼩格⼦组成,每个格⼦的⼤⼩是⼀个字节,每个格⼦可以存 放⼀个字节⼤⼩的数据。我们如何才能知道,数据存放在哪些格⼦中,那就得靠地址,地址类似于楼房的门牌号,是内存的标识符。 id(object) :函数是返回对象 object 在其⽣命周期内位于内存中的地址, id 函数的参数类型是⼀个对象。 is :
⽐较的是两个对象的 id 值是否相等,也就是⽐较俩对象是否为同⼀个实例对象,是否指向同⼀个内存地址。 == :
⽐较的是两个对象的内容是否相等,默认会调⽤对象的 __eq__() ⽅法。 对在【 -5 , 256 】之外的数字 is 不等时的解释:出于对性能的考虑, Python 内部做了很多的优化⼯作,对于整数对象, Python 把⼀些频繁使 ⽤的整数对象缓存起来,保存到⼀个叫 small_ints 的链表中,在 Python 的整个⽣命周期内,任何需要引⽤这些整数对象的地⽅,都不再重新 创建新的对象,⽽是直接引⽤缓存中的对象。 Python 把这些可能频繁使⽤的整数对象规定在范围 [-5, 256] 之间的⼩对象放在 small_ints 中,但 凡是需要⽤些⼩整数时,就从这⾥⾯取,不再去临时创建新的对象。因为 257 不再⼩整数范围内,因此尽管 a 和 b 的值是⼀样,但是他们在 Python 内部却是以两个独⽴的对象存在。 不同代码块中的 257 不等,相同代码块则相等的解释: Python 程序由代码块构成,代码块作为程序的⼀个最⼩基本单位来执⾏。⼀个模块⽂ 件、⼀个函数体、⼀个类、交互式命令中的单⾏代码都叫做⼀个代码块。 c = 257 作为⼀个代码块,函数 foo 作为另外⼀个代码块。 Python 内 部为了将性能进⼀步的提⾼,凡是在⼀个代码块中创建的整数对象,如果存在⼀个值与其相同的对象于该代码块中了,那么就直接引⽤,否 则创建⼀个新的对象出来。 Python 出于对性能的考虑,但凡是不可变对象,在同⼀个代码块中的对象,只有是值相同的对象,就不会重复创 建,⽽是直接引⽤已经存在的对象。因此,不仅是整数对象,还有字符串对象也遵循同样的原则。所以 a is b 就理所当然的返回 True 了,⽽ c 和 a 不在同⼀个代码块中,因此在 Python 内部创建了两个值都是 257 的对象。 1 、⼩整数对象 [-5,256] 是全局解释器范围内被重复使⽤,永远不会被 GC 回收。 2 、同⼀个代码块中的不可变对象,只要值是相等的就不会重复创建新的对象。 python 中的堆栈含义: 内存空间在逻辑上分为三部分:代码区、静态数据区和动态数据区,动态数据区⼜分为栈区和堆区。 代码区:存储⽅法体的⼆进制代码。⾼级调度(作业调度)、中级调度(内存调度)、低级调度(进程调度)控制代码区执⾏代码的切换。 静态数据区:存储全局变量、静态变量、常量,常量包括 final 修饰的常量和 String 常量。系统⾃动分配和回收。 栈区:存储运⾏⽅法的形参、局部变量、返回值。由系统⾃动分配和回收。 堆区: new ⼀个对象的引⽤或地址存储在堆区,指向该对象存储在堆区中的真实数据。 简⽽⾔之⼀句话:栈放变量,堆放对象
|
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |