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))