python中的变量内存以及关于is==、堆栈、

您所在的位置:网站首页 堆栈工作 python中的变量内存以及关于is==、堆栈、

python中的变量内存以及关于is==、堆栈、

2023-03-15 06:17| 来源: 网络整理| 查看: 265

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