基于Python对象引用、可变性和垃圾回收详解
本篇攻略将介绍Python中的对象引用机制、不可变性、可变性、垃圾回收机制等内容。
对象引用
在Python中,所有变量都是对象的引用,即变量名本身并不含有真正的数值或对象,仅仅指向保存在内存中的一个地址。下面是一个简单的示例:
a = 5
在这个示例中,变量a是一个对象的引用,指向一个值为5的整型对象。
当变量a赋值给另一个变量b时,实际上是让变量b也指向同一个内存地址,从而引用了同一个对象。例如:
b = a
在这个示例中,变量b也指向同一个整型对象。
不可变性
Python中的某些对象是不可更改的,即创建后无法改变其值或内容。这些对象称为不可变对象,包括整型、浮点型、复数型、字符串、元组等。
下面是一个字符串常量示例:
s = "hello"
字符串对象s是不可变的,若要改变其值,则需要创建一个新的字符串对象,再用变量s引用新的对象,例如:
s = "world"
这个示例中,创建了一个新的字符串对象,变量s从原先的字符串对象"hello"转而引用新的字符串对象"world"。
可变性
Python中的某些对象是可更改的,即创建后可以改变其值或内容。这些对象称为可变对象,包括列表、字典等。
下面是一个列表示例:
lst = [1, 2, 3, 4]
列表对象lst是可变的,可以通过索引或方法改变其内容,例如:
lst[1] = 5
lst.append(6)
这个示例中,将列表lst中索引为1的元素修改为5,再新增一个元素6。
垃圾回收
Python中的垃圾回收机制负责回收不再被引用的对象所占用的内存空间。Python使用引用计数算法进行垃圾回收。当某个对象的引用计数为0时,表示该对象不再被引用,垃圾回收机制将会回收该对象的内存空间。
下面是一个示例:
a = [1, 2, 3]
b = a
del a
在这个示例中,变量b也引用列表对象[1, 2, 3],当变量a被del删除后,该列表对象的引用计数为0,垃圾回收机制将会回收该对象的内存空间。
示例1
下面是一个示例,展示了可变对象的引用机制:
lst1 = [1, 2, 3]
lst2 = lst1
lst1.append(4)
print(lst2)
输出:
[1, 2, 3, 4]
在这个示例中,列表对象lst1是可变的,创建后可以改变其内容。将lst1赋值给变量lst2后,实际上是让两个变量都引用了同一个列表对象。当执行lst1.append(4)时,列表对象lst1的内容被修改,但实际上变量lst2所引用的也是同一个对象,因此lst2的值也改变,输出列表[1, 2, 3, 4]。
示例2
下面是一个示例,展示了垃圾回收机制的作用:
def func():
a = [1, 2, 3]
b = a
del a
return b
print(func())
输出:
[1, 2, 3]
在这个示例中,函数func创建了一个列表对象[1, 2, 3],并将其赋值给变量a,再将a赋值给变量b。当执行del a后,列表对象[1, 2, 3]的引用计数为0,因此垃圾回收机制将回收该对象占用的内存空间。但变量b仍然引用该列表对象,因此调用函数func()时,函数返回的是列表[1, 2, 3]。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:基于Python对象引用、可变性和垃圾回收详解 - Python技术站