python核心课程-面相对象-内存管理机制1

1.存储方面:

1.1在python中万物皆对象

    不存在基本数据类型。0, 1.2, True, False, "abc"这些全是对象。

1.2所有对象,都会在内存中开辟一块空间进行储存。

    会根据不同的类型及内容,开辟不同的空间大小进行存储。返回该空间的地址给外界接收(称为“引用”),用于后续对这个对象的操作。

    可通过id()函数获取内存地址(十进制)

    通过hex()函数可以查看对应的16进制地址。

class Person:
    pass

p = Person()

print(p)

print(id(p))

print(hex(id(p)))

1.3对于整数和短小的字符,python会进行缓存,不会创建多个相同对象。

    

num1 = 1
num2 = 1

print(id(num1), id(num2))

1.4容器对象,存储的其他对象,仅仅是其他对象的引用,并不是其他对象本身。

2.垃圾回收方面

2.1引用计数器:

    概念:一个对象,会记录着自身被引用的个数。每增加一个引用,这个对象的引用计数器会自动+1。每减少一个引用,这个对象的引用计数器会自动-1。

    举例:

    引用计数器+1:

    对象被创建:p1 = Person

    对象被引用:p2 = p1

    对象被作为参数,传入到一个函数中:这个时候计数器是+2的。是因为有两个属性在调用着。

    对象作为一个元素,存储在容器中:

import sys
class Person:
    pass

p = Person()

print(sys.getrefcount(p))

# def log(obj):
#     print(sys.getrefcount(obj))

# log(p)

l = [p]
print(sys.getrefcount(p))

    引用计数器-1:

    对象的别名被显示的销毁:del p1

    对象的别名被赋予了新的对象:p1 = 123

    一个对象离开他的作用域:

        一个函数执行完毕时。

        内部的局部变量关联的对象,它的引用被释放了。

    对象所在的容器被销毁,或从容器中删除对象。

    查看引用计数:

    import sys

    sys.getrefcount(对象) 注意会大一

# ---------------------------------------------------垃圾回收方面-------------------------------------------------------
import sys

class Person:
    pass


print(sys.getrefcount(Person))
p1 = Person()
print(sys.getrefcount(Person))
p2 = p1
print(sys.getrefcount(Person))
del p2
print(sys.getrefcount(Person))
del p1
print(sys.getrefcount(Person))


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值