You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

函数内部创建对象的内存分配及引用位置问题

关于类对象、函数变量与内存的几个问题解答

嘿,咱们一步步把这几个问题掰明白,用实际例子帮你理解~

1. 同一对象的函数中的变量是否属于共享内存?

这得分情况看,函数里的变量可不是铁板一块:

  • 函数局部变量:比如方法里定义的local_var = 2这种,每次调用这个方法时,都会在当前方法的栈帧里新建一个变量,调用结束就销毁,完全不共享。哪怕是同一个对象多次调用同一个方法,每次的局部变量都是独立的内存空间。
  • 实例变量(self.xxx):这种变量是绑定在对象本身上的,存在对象的堆内存区域里。同一个对象的所有方法访问的都是这个变量的同一块内存,相当于“共享”——比如你在A方法里改了self.name,B方法里读的就是修改后的值。
  • 类变量:定义在类里、方法外的变量(比如class_var = 0),这是属于类本身的,所有该类的实例对象都会共享这一块内存,改一个实例的类变量,其他实例看到的也是修改后的值。

举个Python代码例子更清楚:

class MyClass:
    class_var = 0  # 类变量,所有实例共享

    def __init__(self):
        self.instance_var = 1  # 实例变量,每个对象独有

    def some_method(self):
        local_var = 2  # 局部变量,每次调用方法都重新创建
        print(f"局部变量地址: {id(local_var)}")

obj = MyClass()
obj.some_method()  # 打印一个地址
obj.some_method()  # 打印另一个不同的地址,说明每次都是新的

2. 在函数中创建类对象,其引用会存放在哪里?

假设你写了这样的代码:

def create_my_obj():
    new_obj = MyClass()  # 创建类对象
    return new_obj

这里的new_obj是函数create_my_obj的局部引用变量,它会存放在该函数执行时的栈帧里。而new_obj指向的实际对象(MyClass()实例)是存在堆内存中的。

当函数执行时,栈帧会被创建,局部变量(包括这个引用)就放在栈帧里;如果函数返回这个引用,那么调用函数的地方会拿到这个引用,此时对象依然在堆里;如果函数没返回这个引用,函数执行完毕后栈帧被销毁,这个引用就消失了——如果此时没有其他引用指向堆里的对象,这个对象就会被垃圾回收机制清理掉。

3. 这个引用是否会被共享?

默认情况下不会。这个引用是函数的局部变量,只在函数的栈帧范围内有效,函数执行完如果没把它传递出去,它就直接消失了,根本没机会被共享。

只有当你主动把这个引用传递出去(比如返回给调用者、作为参数传给其他函数、赋值给全局变量或者其他对象的属性),才会有多个地方持有这个引用。但要注意:这些引用本身是各自独立的变量,只是它们都指向堆内存里的同一个对象而已——并不是引用被共享,而是多个引用指向同一个对象。


内容的提问来源于stack exchange,提问作者Kamal Ahmad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:05:28