Python 类 变量 不自动重置问题
说明:今天偶尔发现 python 的一个类,在实例化多个对象的时候,对象里的变量居然不会重置
一、先看一下小实验
class Test: a = 1 b = {'value': 1} def test(self): print(self.a, end=' ') print(self.b) self.a += 1 self.b['value'] += 1 if __name__ == '__main__': for i in range(5): t = Test() t.test()
输出结果:
从结果上来看:int 类型的 a 每次实例化都重新赋值为 1,没什么问题;但 dict 类型的 b 每次实例化不会重置,它的值是一直保留的
二、异常原因
之前我也知道 python 里数据类型分为两种:不可变对象、可变对象;例如,数字、字符串和元组是不可变的,而字典和列表是可变的;
不可变对象的意思是,一个值对应一个内存地址,不可以在原地址上修改。例如:从 a = 1 修改为 a = 2,变量 a 对应的内存地址就会改变;
可变对象的意思是,变量就固定一个内存地址上,修改变量的值,内存地址不变。例如:从 b = {'value': 1} 修改为 b['value'] = 2,变量 b 对应的内存地址不会变;
也就是说:不可变对象不能在原地址上修改,每次修改相当于创建一个新的变量;可变类型可以在原地址上修改,每次修改就是修改的原变量本身。
用大白话来说,就是:list 或 dict 变量的值是引用的,相当于全局变量,在哪读取或修改,都是同一个变量
1)我之前也知道有这两种类型,但我以为在类外面定义的全局变量才会这样,没想到类里面定义的也会这样
2)而且在类头部定义的可变对象,只有第一次实例化的时候才会初始化赋值,后面的实例化就自动忽略头部的赋值了。也是挺神奇的!!!
三、解决办法
不要在头部声明变量,直接在 __init__ (或 __new__)里声明变量
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
2018-06-10 H5 (webApi) 接口帮助文档