持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情
本文已参与「新人创作礼」活动,一起开启掘金创作之路。
python 内存管理方式
(1)垃圾回收
(2)引用计数
(3)内存池机制
1.1垃圾回收
在python中修改变量值得操作,其实并不是修改了变量的数字,二是修改了变量指向的内存地址 (Number 和 字符串)
如图所示
python具有自动管理内存的功能,对于没有任何变量指向的值,python将其自动删除
1、当内存中有不再使用的部分时,垃圾收集器就会把他们清理掉。它会去检查那些引用计数为0的对象,然后清除其在内存的空间。当然除了引用计数为0的会被清除,还有一种情况也会被垃圾收集器清掉:当两个对象相互引用时,他们本身其他的引用已经为0了。
2、垃圾回收机制还有一个循环垃圾回收器, 确保释放循环引用对象(a引用b, b引用a, 导致其引用计数永远不为0)
1.2引用计数
上面我们只是改变了变量指向的地址 那么引用计数就是有有几个对象指向了改对象
如图所示
我们首先创造3.14这个对象然后x指向他,然后y也指向他,使得3.14的引用计数为2
可以理解为变量更像是附在对象上的标签(和引用的定义类似)。当变量被绑定在一个对象上的时候,该变量的引用 计数就是1,(还有另外一些情况也会导致变量引用计数的增加),系统会自动维护这些标签,并定时扫描,当某标签的引用计数变为0的时候,该对就会被回收。
1.3内存池机制
在 python 中,strings, tuples, 和 numbers 是不可更改的对象,而 list,dict 等则是可以修改的对象。
Python对象,例如数值、字符串,元组(tuple不允许被更改)采用的是复制的方式(深拷贝),也就是说当将另一个变量B赋值给变量A时,虽然A和B的内存空间仍然相同,但当A的值发生变化时,会重新给A分配空间,A和B的地址变得不再相同
如图所示
而对于像字典(dict),列表(List)等,改变一个就会引起另一个的改变(改变后地址不变),也称之为浅拷贝
2.python的数据结构
- list = [val1,val2,val3,val4] #列表
- dict = {key1:val1,key2:val2} #字典
- tuple = (val1,val2,val3,val4) #元组
- set = {val1,val2,val3,val4} #集合
2.1 列表
- 列表中的每个元素都是可变的;
- 列表中的元素是有序的,也就是说每个元素都有一个位置;
- 列表中可以容纳 Python 中的任何对象。
如下:
all_in_list = [ 1, #整数 1.0, #浮点数 'a word', #字符串 print(1), #函数 True, #布尔值 [1,2], #列表中套列表 (1,2), #元祖 {'key':'value'} #字典 ] |
---|
2.2字典
- 字典中数据必须是以键值对的形式出现的;
- 逻辑上讲,键是不能重复的;
字典中的键(key)是不可变的,也就是无法修改的,而值(value)是可变的,可修改的,可以是任何对象。
NASDAQ_code = { 'BIDU':'Baidu', 'SINA':'Sina', 'YOKU':'Youku' } |
---|
- 列表中用来添加多个元素的方法为
extend
,在字典中添加多个元素的方法为update()
- 字典是不能切片的,即这样的写法是错误的:
chart[1:4]
- 字典的dict.get(key, default=None)查找字典中key对应的值,若不存在第二个参数是设置的默认值
2.3元组
元组可以理解为一个稳固版的列表,因为元组是不可以修改的,因此在列表中的存在的方法均不可以使用在元组上,但是元组是可以被查看索引的,方式和列表一样。
letters = ('a, 'b', 'c', 'd') letters[0] |
---|
2.4集合
集合则更接近数学上集合的概念。每一个集合中是的元素是无序的、不重复的任意对象,我们可以通过集合去判断数据的从属关系,有时还可以通过集合把数据结构中重复的元素减掉。
集合不能被切片也不能被索引,除了做集合运算之外,集合元素可以被添加还有删除:
a_set = {1,2,3,4} a_set.add(5) a_set.discard(5) |
---|