阅读 267

python字符串内存分布

这是我参与更文挑战的第 3 天,活动详情查看: 更文挑战

1.基本概念

1.1 对象

python中,一切皆对象 。每个对象都由标识(ID)、类型(type)、及值(value)组成。

image.png

我们定义一个变量Name,值为“JUEJING”

id(Name)函数查到Name的ID为2729105983472,这给就是对象“JUEJING”的地址

image.png

1.2 引用

python中,变量成为:对象的引用。因为,变量存储的就是对象的地址。

变量通过地址来引用了“对象”

变量位于:栈内存

对象位于:堆内存

image.png

重点:

Python是动态类型语言 变量不需要显式声明类型,根据变量引用的对象,python解释器自动获取数据类型

Python是强类型语言 每个对象都要数据类型,只支持该类型支持的操作

举个栗子:

image.png

1.3 栈内存和堆内存

image.png

2.字符串的内存分布

2.1 声明字符的内存分布

给一个变量赋值字符串,赋值之前先会去内存中的 堆内存 查询要赋值的字符串是否已经存在

  • 如果存在的话直接将该变量指向字符串的内存地址

  • 如果不存在的话,在堆内存直接创建新的字符串并将内存地址传给变量

# 定义Name变量
Name = "JUEJING"

# 再定义Myname变量也为JUEJING

MyName =  "JUEJING"

# 打印两个变量,存储是同一个数据

print(Name,MyName)
print(id(Name),id(MyName))

复制代码

image.png

2.2 不可变数据类型内存分布

Python标准语法中,不支持字符串直接修改内部数据

# 定义Name变量
Name = "JUEJING"

# 修改Name变量

#Name =  "Tome"

# 修改Name之后,Name会被引用到“Tom”新的对象里

print(Name)
print(id(Name))
复制代码
前后两次结果打印
————---------
JUEJING
4545145648
-------------
修改Name结果打印
-------------
Tome
4545145712
复制代码

截屏2021-06-03 23.39.12.png

2.3 拼接字符串内存分布
  • 字符串直接通过引号声明赋值,会在静态区分配内存创建数据

  • 字符串通过拼接运算进行赋值,会在堆内存中完成运算处理结果的内存分配

# 定义h1,h2,h3,h4变量
h1 = "hello"       #4545145776
h2 = "JUEJING"     # 4545145904
h3 = "helloJUEJING"
h4 = h1+h2

print(id(h3)) # 4545146160
print(id(h4)) # 4545146032

复制代码

截屏2021-06-03 23.25.03.png

总结

python字符串内存分配情况,最核心的部分是栈内存和堆内存理解,后续会再次有更深入的学习

好啦,以上是关于python字符串的内存原理讲解,欢迎大佬们指正

我是学习python小白,盆友圈的小可爱,下期见~

文章分类
后端
文章标签