python垃圾回收机制

文章目录

      • 可变不可变对象
      • 垃圾回收机制
      • 引用计数
      • 缓存机制

可变不可变对象

Python中每个对象都可以归类为不可变或可变的。在核心类型中,数字 、字符串和元组是不可变的(不可变类型),其他是可变类型,完全自由的改变。
python中不可变数据类型的定义为:当该数据类型的对应变量的值发生了改变,那么它对应的内存地址也会发生改变,就称不可变数据类型,包括:int(整型)、string(字符串)、tuple(元组)。

h1 = [1]
h2 = [1]
print(h1==h2)#判断是否对象的值相同
print(h1 is h2)#判断是否同一个对象
print(id(h1)==id(h2))

True
False
False

可变对象

h = [1]#可变对象,修改对象的值,内存地址不变化
print(id(h))
h.append(2)
print(id(h))


2373246041856
2373246041856

不可变对象

s = "1"#不可变对象,一旦创建了一个字符串对象,就不能修改它的值。只能创建一个新的字符串对象来代替原来的字符串。
print(id(s))
s = "2"
print(id(s))


1562553106672
1562555503472

垃圾回收机制

Python的垃圾回收机制主要有两种:引用计数和循环垃圾回收。

引用计数是Python最基本的垃圾回收机制。每个对象都有一个引用计数,当对象被引用时,计数加一,当对象不再被引用时,计数减一。当计数为0时,对象就可以被销毁了。这种机制的优点是实现简单,效率高,但它不能处理循环引用的情况。

循环垃圾回收机制可以解决循环引用的问题。循环引用指的是两个或多个对象之间相互引用,形成一个环。这种情况下,引用计数会一直保持不为0,导致对象无法被销毁。循环垃圾回收机制会定期扫描所有对象,找出不再被引用的对象,并将它们销毁。这种机制的缺点是实现复杂,效率相对较低。

引用计数

在Python中,对象的生命周期由垃圾回收机制来管理。当一个对象不再被引用时,它就可以被销毁了。在这个过程中,Python的垃圾回收机制会定期扫描所有对象,找出不再被引用的对象,并将它们销毁。

a = [1, 2, 3]  # 创建一个列表对象,引用计数为1
b = a  # 将列表对象赋值给变量b,引用计数加1,变为2
c = a  # 将列表对象赋值给变量c,引用计数加1,变为3
del a  # 删除变量a,引用计数减1,变为2
b = 1  # 将变量b赋值为整数1,列表对象的引用计数减1,变为1
c = "hello"  # 将变量c赋值为字符串"hello",列表对象的引用计数减1,变为0
# [1,2,3]对象的引用为0则会被回收删除

缓存机制

  • 在Python中,整数、短字符串和短元组等不可变对象会被缓存并重用,这是为了提高性能和减少内存消耗。因此,当你创建一个新的整数对象时,如果它的值已经存在于缓存中,那么Python会返回缓存中的对象而不是创建一个新的对象,这就是所谓的整数对象的缓存机制。因此,当你创建两个值相同的整数对象时,它们的内存地址是相同的。
  • 特殊的垃圾回收机制,即缓存机制。对于一些常用的对象,比如整数、浮点数、空字符串等,Python会将它们缓存起来,以便重复使用。这种机制可以提高程序的性能和减少内存消耗。但是,需要注意的是,缓存机制只适用于不可变对象,对于可变对象,缓存机制不起作用。
d1 = 1#在这个例子中,d1和d2都是整数1,它们的内存地址是相同的,因为它们都指向缓存中的同一个整数对象。
d2 = 1
print(id(d1))
print(id(d2))


140736073094816
140736073094816

你可能感兴趣的:(python学习手册,python,jvm,java)