2.Python 赋值与内存

Wesley13
• 阅读 649

定义变量和赋值就是系统处理内存的过程和问题,这篇文章分别从申请和释放内存两部分讨论

============================================

一、申请内存


python定义一个变量时,会为变量的对象申请一个内存,该变量会存储指向该对象内存中的地址

这样的好处是复用共同内容对象,节省内存空间

In [1]:

name = 'admin'
print("name=", name)

name1 = name
print("name1=", name1)

name= admin
name1= admin

In [2]:

name2 = 'admin'
print("name2=", name2)

name2= admin

In [3]:

print(id(name), name)
print(id(name1), name1)
print(id(name2), name2)

2951857458848 admin
2951857458848 admin
2951857458848 admin

如图:定义了name变量,赋值为“admin”,然后将name赋值给name1,则name1拥有了与name相同的值。再定义另一个变量name2,将name2的值设值为“admin”。也就是name,name1和name2值都为“admin”。则系统赋值运行的过程如下:

1.系统会申请一个内存,存放“admin”

2.将name,name1和name2共用“admin”这个内存

2.Python 赋值与内存

In [4]:

name2 = name
print(name == name2)
print(id(name) == id(name2))

True
True

In [5]:

name2 = "admin1"
print(id(name), name)
print(id(name2), name2)

print(name == name2)
print(id(name) == id(name2))

2951857458848 admin
2951857622744 admin1
False
False

上面两块代码验证了在python系统中,变量会共用相同的值的内存。

1.当name2的值与name的值为“admin”时,name2与name对象的内存地址相同。

2.当name2的值改变为“admin1”时,name2对象的内存地址将会改变了¶

2.Python 赋值与内存

二、释放内存


Python的内存管理主要有三种机制:引入计数机制、垃圾回收机制和内存池机制。

引入技术机制:在python内部,通过引入技术来保持追踪内存中的对象,python内部记录对象有多少个引用,即引用计数,当对象被创建使就创建一个引用计数,当对象不再需要时,这个对象的引用计数为0时,它将被垃圾回收。

垃圾回收机制:当内存中不再使用该内存部分时,垃圾收集器就会把它们清理掉。它会去检查引用计数为0的对象,然后清除其所在的内存的空间。

内存池机制:在Python中,许多时候申请的内存都是小块的内存,这些小块内存在申请后,很快又会被释放,由于这些内存的申请并不是为了创建对象,所以并没有对象一级的内存池机制。这就意味着Python在运行期间会大量地执行malloc和free的操作,频繁地在用户态和核心态之间进行切换,这将严重影响Python的执行效率。为了加速Python的执行效率,Python引入了一个内存池机制,用于管理对小块内存的申请和释放。内存池的概念就是预先在内存中申请一定数量的,大小相等的内存块留作备用,当有新的内存需求时,就先从内存池中分配内存给这个需求,不够了之后再申请新的内存。这样做最显著的优势就是能够减少内存碎片,提升效率。内存池的实现方式有很多,性能和适用范围也不一样。

下面通过三个步骤分析内存管理和释放的过程:

步骤1:将name2和name1的值都更变为“admin1”,可以发现,name1和name2的对象都为“admin1”,name1和name2打印出来的对象内存地址都是相同的。而name对象为“admin”,name打印出来的内存地址与另外两个不同。

In [6]:

name2 = 'admin1'

In [7]:

name1 = name2
print(id(name1), name1)
print(id(name2), name2)

print(id(name), name)

2951857622744 admin1
2951857622744 admin1
2951857458848 admin

步骤2:将name的对象也更变为“admin1”,再从新打印发现name,name1和name2的地址一样了。

In [8]:

name = 'admin1'
print(id(name1), name1)
print(id(name2), name2)
print(id(name),name)

2951857622744 admin1
2951857622744 admin1
2951857622744 admin1

步骤3:重新申请name并复制为“admin”,打印出来后,发现该步骤中打印的name的对象内存地址与步骤一种打印name的内存地址变得不一样了。

In [9]:

name = 'admin'

print(id(name1), name1)
print(id(name2), name2)
print(id(name),name)

2951857622744 admin1
2951857622744 admin1
2951857632064 admin
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Wesley13 Wesley13
3年前
Java 中的堆和栈
Java中的堆和栈简单的说:Java把内存划分成两种:一种是栈内存,一种是堆内存。      在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。      当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Stella981 Stella981
3年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这