python的内存管理--自动管理

# -*- coding:utf-8 -*-
1. python中自动管理内存的
   自动管理内存编程语言,例如:object-c  python
  手动管理内存编程语言   例如: c

 2. python中的内存管理采用的  ‘引用计数’的方式,如果一个对象的引用计数为0,该对象占用的内存会被python解释器清空,对象也会消失,如果一个对象的引用计数超过0,这个对象会一直存放在内存中


 
3. python中是自动管理内存的,实际上是通过“引用计数”的方式来管理内存。当一个对象被创建出来的时候,引用计数为1,当对象被其他对象引用时,引用计数+1,当对象的引用被删除时,引用计数会-1,当对象的引用计数为0时,该对象所在的内存会被系统在合适的时候回收

 
   4. 对象在内存中无法释放的情况,称之为内存泄漏,内存泄漏会导致程序占用内存过多,程序出现卡顿的情况,严重情况可能会导致内存崩溃,程序结束或者闪退
    对象多次删除,导致引用计数过度减少,在之后的代码中有可能导致该对象不可用

5. sys 操作系统模块

import sys
class People(object):
    pass
6.当创建一个对象时,这个对象的计数为1
p1 = People()
7. 通过这个函数可以查看对象的引用计数
  ps:在这查到的是2,自己创建对象的时候+1,编译程序的时候,解释器+1(不需要我们管理)
number = sys.getrefcount(p1)
print(number)
8. 当对象被引用的时候,计数会+1
p2 = p1

9.过度释放

# del p1
# del p2
print(sys.getrefcount(p1))


10.把对象放入列表中,也会造成计数+1
list1 = [p1]
print(sys.getrefcount(p1))
11.创建对象
p3 = People()
 给p3添加一个obj属性,属性值是一个p1对象
p3.obj = p1
print(sys.getrefcount(p1))

12. 当引用被删除的时候,引用计数-1
del p2
print(sys.getrefcount(p1))
13. 从列表中移除,引用计数-1
del list1[0]
print(sys.getrefcount(p1))
14. 删除对象的属性
del p3.obj
print(sys.getrefcount(p1))
15. 删除创建时的引用计数,p1对象会被从内存中移除
del p1
# print(sys.getrefcount(p1))
16.  删除对象
class Man(object):
    # 当对象被创建的时候,回去执行初始化函数
    def __init__(self):
        print('Man类的对象被创建了!')

    def eat(self):
        print('执行了Man类的eat函数!')

    # 当对象被删除(清除内存)的时候,会执行del 函数
    def __del__(self):
        # 可以在对象被删除时,添加一些功能:例如,保存数据。。。
        print('Man类的对象被清除了!')

17.执行函数

m = Man()
m.eat()
m1 = m
# 手动删除对象  引用计数-1
del m
m1.eat()
# 手动删除对象  引用计数-1 为0 对象被删除
del m1

18.完整代码

# -*- coding:utf-8 -*-


# python中自动管理内存的
# 自动管理内存编程语言,例如:object-c  python
# 手动管理内存编程语言   例如: c

# python中的内存管理采用的  ‘引用计数’的方式,如果一个对象的引用计数为0,该对象占用的内存会被python解释器清空,对象也会消失,如果一个对象的引用计数超过0,这个对象会一直存放在内存中


# !!!!!!!!!!!!背
# python中是自动管理内存的,实际上是通过“引用计数”的方式来管理内存。当一个对象被创建出来的时候,引用计数为1,当对象被其他对象引用时,引用计数+1,当对象的引用被删除时,引用计数会-1,当对象的引用计数为0时,该对象所在的内存会被系统在合适的时候回收

'''
    对象在内存中无法释放的情况,称之为内存泄漏,内存泄漏会导致程序占用内存过多,程序出现卡顿的情况,严重情况可能会导致内存崩溃,程序结束或者闪退
    对象多次删除,导致引用计数过度减少,在之后的代码中有可能导致该对象不可用

'''


# sys 操作系统模块
import sys
class People(object):
    pass

# 当创建一个对象时,这个对象的计数为1
p1 = People()
# 通过这个函数可以查看对象的引用计数
# ps:在这查到的是2,自己创建对象的时候+1,编译程序的时候,解释器+1(不需要我们管理)
number = sys.getrefcount(p1)
print(number)
# 当对象被引用的时候,计数会+1
p2 = p1

# 过度释放
# del p1
# del p2

print(sys.getrefcount(p1))
# 把对象放入列表中,也会造成计数+1
list1 = [p1]
print(sys.getrefcount(p1))

# 创建对象
p3 = People()
# 给p3添加一个obj属性,属性值是一个p1对象
p3.obj = p1
print(sys.getrefcount(p1))

# 当引用被删除的时候,引用计数-1
del p2
print(sys.getrefcount(p1))

# 从列表中移除,引用计数-1
del list1[0]
print(sys.getrefcount(p1))

# 删除对象的属性
del p3.obj
print(sys.getrefcount(p1))

# 删除创建时的引用计数,p1对象会被从内存中移除
del p1
# print(sys.getrefcount(p1))


# 删除对象
class Man(object):
    # 当对象被创建的时候,回去执行初始化函数
    def __init__(self):
        print('Man类的对象被创建了!')

    def eat(self):
        print('执行了Man类的eat函数!')

    # 当对象被删除(清除内存)的时候,会执行del 函数
    def __del__(self):
        # 可以在对象被删除时,添加一些功能:例如,保存数据。。。
        print('Man类的对象被清除了!')


m = Man()
m.eat()
m1 = m
# 手动删除对象  引用计数-1
del m
m1.eat()
# 手动删除对象  引用计数-1 为0 对象被删除
del m1
19.执行结果:

2
3
4
5
4
3
2
Man类的对象被创建了!
执行了Man类的eat函数!
执行了Man类的eat函数!
Man类的对象被清除了!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值