python引用计数的原理

垃圾回收机制:
python的垃圾回收采用的是 引用计数机制为主和 分代回收机制为辅的 结合机制,当对象的引用计数变为0时,对象将被销毁,除了解释器默认创建的对象外(默认对象的引用计数永远不会变成0)
python关于对象的管理:最关键的是引用计数这个机制

一、引用计数增加的情况:

1) 创建对象,用变量接收 : name = '123'
2) 对象被其他的变量引用 : name2 = name
3) 对象被其他的对象引用(放入其他容器类型的数据中)li = [11,22,name]
4) 当成函数传入函数中时
    def func(n):
        print(n)
        
    func(name)

1.对象被引用

>>> name = '123'
>>> import sys
>>> sys.getrefcount(name)
2

name = ‘123’,引用了一次,sys.getrefcount(name)引用了一次,所以为2

2.对象被其他的变量引用

>>> name = '123'
>>> import sys
>>> name2 = name
>>> sys.getrefcount(name)
3
>>> id(name)
140555027868528
>>> id(name2)
140555027868528

每一次赋值都会增加数据操作的引用次数,name,name2都指向’123’,而不是变量本身
3. 对象被其他的对象引用(放入其他容器类型的数据中)li = [11,22,name]

>>> name = '123'
>>> import sys
>>> name2 = name
>>> sys.getrefcount(name)
3
>>> li = [11,22,name]
>>> sys.getrefcount(name)
4

对象作为一个对象,存储在容器中,被引用一次,次数+1

4. 当成函数传入函数中

函数 sys.getrefcount() 调用时 会增加一个引用,调用完又销毁一个引用。 实际上就是实参传给形参的问题

二、引用计数减少的情况

1) 变量被显式销毁 del name
2) 引用对象的变量指向了其他对象(变量被重新赋了个别的值) name2 = ‘abc’
3) 从其他对象(容器类型数据中移除时),li.pop()
4) 函数执行完毕之后,内部作用域的变量会被销毁
1.变量被显示销毁

>>> a = 3.135
>>> b = a
>>> del b
>>> import sys
>>> sys.getrefcount(a)
2
>>>

2.引用对象的变量指向了其他对象

>>> a = 3.145
>>> b = a
>>> import sys
>>> sys.getrefcount(a)
3
>>> b = -3.152
>>> sys.getrefcount(a)
2
>>> 

3.从其他对象(容器类型数据中移除时),li.pop()

>>> a = 258.7
>>> import sys
>>> sys.getrefcount(a)
2
>>> list1 = [a,1,2,3]
>>> sys.getrefcount(a)
3
>>> del list1
>>> sys.getrefcount(a)
2

4.函数执行完毕之后,内部作用域的变量会被销毁

>>> a = 3.1415926   # 增加一个引用  count = 1 
>>> sys.getrefcount(a)   # 增加一个引用  count = 1  ==>   打印 2  ==>  减少一个引用  count = 1
2

python中的数据池机制:
1、小整数池: -5 到 256之间的整数,python做了一个数据池实现创建好所有的数据,当程序中使用这个范围内的对象,不会重新创建,直接引用

>>> c = 35
>>> sys.getrefcount(c)
9
>>> 

这里35这个对象并没有在内存中新建,因为在Python启动解释器的时候会创建一个小整数池,-5~256之间的这些对象会被自动创建加载到内存中等待调用;c = 35是为35这个整数对象增加了一个引用

2、字符串驻留池(intern机制):由纯单词字符(数字、字母、下划线)组成的字符串,python也做了优化纯单字符组成的字符串,在创建之后会被加入字符串驻留池中,如果程序中再次定义相同的字符串,则直接引用

缓存机制:为了减少内存的频繁申请和销毁而设定了优化机制
对于一些常用的内置数据类型,python针对每个数据类型都设定了缓存机制

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值