面试题答案
一键面试Python对象的引用计数工作原理
在Python中,每个对象都维护着一个引用计数。引用计数记录了指向该对象的引用(即指针)的数量。当一个对象被创建时,它的引用计数初始化为1。每当有一个新的引用指向该对象时,引用计数就会加1;而当一个引用不再指向该对象(例如变量被重新赋值、超出作用域或者显式地删除变量)时,引用计数就会减1。
对内存分配的影响
- 内存分配:当创建新对象时,Python会为其分配内存空间,并将引用计数设置为1。例如
a = 10
,此时整数对象10
被创建并分配内存,变量a
引用它,引用计数为1。 - 内存释放:当对象的引用计数变为0时,Python会立即回收该对象所占用的内存空间。这意味着Python不需要像其他语言(如C++)那样手动管理内存释放,大大简化了编程。
引用计数变化导致内存分配或释放的情况举例
-
引用计数增加:
a = [1, 2, 3] # 创建列表对象,a引用它,引用计数为1 b = a # b也引用该列表对象,引用计数加1,变为2
-
引用计数减少:
a = [1, 2, 3] b = a del a # 删除a对列表对象的引用,引用计数减1,变为1 b = None # b不再引用列表对象,引用计数再减1,变为0,列表对象占用的内存被释放
-
函数参数传递:
def func(lst): pass my_list = [1, 2, 3] func(my_list) # 函数调用时,my_list作为参数传递,lst也引用该列表对象,引用计数加1
函数调用结束后,
lst
不再存在,引用计数减1。 -
局部变量超出作用域:
def inner(): local_var = [1, 2, 3] # local_var引用列表对象,引用计数为1 inner() # 函数执行完毕,local_var超出作用域,引用计数减为0,列表对象占用的内存被释放