Python类方法中未用self声明的变量是实例独立的还是静态的?
结论
不同实例调用sum方法时,方法内的result变量完全相互独立,不存在跨实例、跨线程的静态共享,并发执行时不会互相干扰。
作用域规则说明
Python的变量作用域严格按代码块边界划分,在实例方法内部直接定义、未绑定到self的变量属于方法局部变量:
- 局部变量的生命周期完全绑定单次方法调用:每次调用方法时,Python会为这次调用生成独立的栈帧,局部变量就存储在当前栈帧的专属空间里,方法执行完毕栈帧销毁,局部变量也会被回收。
- 不管是同一个实例多次调用该方法,还是不同实例并发调用该方法,每次调用生成的局部变量都处于隔离的栈空间中,互不影响。
- 示例代码里
result :int = 0的类型标注不会改变变量的作用域属性,result始终是局部变量。
类相关变量的归属速查
可以按定义位置快速判断变量的共享范围:
- 类变量(静态共享):直接定义在类体中、所有方法外部的变量,所有类实例共享同一份值
- 实例变量(实例级独立):定义在方法内部、通过
self.xxx形式绑定的变量,归属于单个实例,不同实例的同名字段互不影响 - 局部变量(调用级独立):定义在方法内部、未绑定
self也未声明为类属性的变量,仅在单次方法调用过程中有效,同一个实例的多次调用之间都不共享值,更不会跨实例共享。
多线程场景补充
示例中定义的Calculator类继承自threading.Thread,两个线程实例并发执行sum方法时,每个线程持有独立的调用栈,各自栈内的result变量完全隔离,不会出现值互相覆盖的问题。
内容的提问来源于stack exchange,提问作者user19550043
相关产品推荐
相关产品推荐

