MST

星途 面试题库

面试题:Python中对象引用计数与内存分配的关联

请阐述Python对象的引用计数是如何工作的,以及它是怎样影响内存分配的?可以举例说明在什么情况下对象的引用计数会发生变化,进而导致内存的分配或释放。
48.0万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

Python对象的引用计数工作原理

在Python中,每个对象都维护着一个引用计数。引用计数记录了指向该对象的引用(即指针)的数量。当一个对象被创建时,它的引用计数初始化为1。每当有一个新的引用指向该对象时,引用计数就会加1;而当一个引用不再指向该对象(例如变量被重新赋值、超出作用域或者显式地删除变量)时,引用计数就会减1。

对内存分配的影响

  • 内存分配:当创建新对象时,Python会为其分配内存空间,并将引用计数设置为1。例如 a = 10,此时整数对象 10 被创建并分配内存,变量 a 引用它,引用计数为1。
  • 内存释放:当对象的引用计数变为0时,Python会立即回收该对象所占用的内存空间。这意味着Python不需要像其他语言(如C++)那样手动管理内存释放,大大简化了编程。

引用计数变化导致内存分配或释放的情况举例

  1. 引用计数增加

    a = [1, 2, 3]  # 创建列表对象,a引用它,引用计数为1
    b = a  # b也引用该列表对象,引用计数加1,变为2
    
  2. 引用计数减少

    a = [1, 2, 3]
    b = a
    del a  # 删除a对列表对象的引用,引用计数减1,变为1
    b = None  # b不再引用列表对象,引用计数再减1,变为0,列表对象占用的内存被释放
    
  3. 函数参数传递

    def func(lst):
        pass
    my_list = [1, 2, 3]
    func(my_list)  # 函数调用时,my_list作为参数传递,lst也引用该列表对象,引用计数加1
    

    函数调用结束后,lst 不再存在,引用计数减1。

  4. 局部变量超出作用域

    def inner():
        local_var = [1, 2, 3]  # local_var引用列表对象,引用计数为1
    inner()  # 函数执行完毕,local_var超出作用域,引用计数减为0,列表对象占用的内存被释放