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()

输出结果:

Python 类 变量 不自动重置问题

从结果上来看:int 类型的 a 每次实例化都重新赋值为 1,没什么问题;但 dict 类型的 b 每次实例化不会重置,它的值是一直保留的

二、异常原因

之前我也知道 python 里数据类型分为两种:不可变对象、可变对象;例如,数字、字符串和元组是不可变的,而字典和列表是可变的;

不可变对象的意思是,一个值对应一个内存地址,不可以在原地址上修改。例如:从 a = 1 修改为 a = 2,变量 a 对应的内存地址就会改变;

可变对象的意思是,变量就固定一个内存地址上,修改变量的值,内存地址不变。例如:从 b = {‘value’: 1} 修改为 b[‘value’] = 2,变量 b 对应的内存地址不会变;

也就是说:不可变对象不能在原地址上修改,每次修改相当于创建一个新的变量;可变类型可以在原地址上修改,每次修改就是修改的原变量本身。

用大白话来说,就是:list 或 dict 变量的值是引用的,相当于全局变量,在哪读取或修改,都是同一个变量

1)我之前也知道有这两种类型,但我以为在类外面定义的全局变量才会这样,没想到类里面定义的也会这样

2)而且在 类头部定义的可变对象,只有第一次实例化的时候才会初始化赋值,后面的实例化就自动忽略头部的赋值了。也是挺神奇的!!!

三、解决办法

不要在头部声明变量,直接在 init (或 new)里声明变量

Python 类 变量 不自动重置问题

Original: https://www.cnblogs.com/tujia/p/16362256.html
Author: Tiac
Title: Python 类 变量 不自动重置问题

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/10766/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

免费咨询
免费咨询
扫码关注
扫码关注
联系站长

站长Johngo!

大数据和算法重度研究者!

持续产出大数据、算法、LeetCode干货,以及业界好资源!

2022012703491714

微信来撩,免费咨询:xiaozhu_tec

分享本页
返回顶部