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__)里声明变量

 

posted @ 2022-06-10 10:17  Tiac  阅读(584)  评论(0编辑  收藏  举报