实例的python成员变量就像成员变量一样,有些像静态变量一样工作

jin*_*wan 10 python

我是python新手,类的成员变量在我的python代码中工作很奇怪.有些像普通变量一样工作,但有些像静态变量一样工作!

class Chaos:
    list_value = []
    value = "default"

    def set_value(self, word):
        self.list_value.append(word)
        self.value = word 

    def show(self, num):
        print(str(num) + "====")
        print("value : " + self.value)
        for st in self.list_value:
            sys.stdout.write(st)
        print("\n=====\n")

a = Chaos()
a.show(0)
a.set_value("A")
a.show(1)
b = Chaos()
a.show(2)
b.show(3)
Run Code Online (Sandbox Code Playgroud)

结果

0====
value : default

=====

1====
value : A
A
=====

2====
value : A
A
=====

3====
value : default
A
=====
Run Code Online (Sandbox Code Playgroud)

但是测试的最后结果与我在上次测试中的预期不同.'b'实例的'list_value'中不应该有"A".它刚刚创建,从未添加过"A".我在'a'的实例中加了'A',而不是'b'.但结果表明,'b'中也有'A'更多,类中的'list_value'和'value'的工作方式不同.看起来两者都有相同的语法.为什么他们的工作不同?

mgi*_*nbr 21

事实上,这些是类变量.要创建实例变量,请在__init__函数中初始化它们:

class Chaos:
    def __init__(self):
        self.list_value = []
        self.value = "default"
Run Code Online (Sandbox Code Playgroud)

原因value是表现像实例变量是因为你正在设置它self.value.当Python看到self.X它看起来X你的对象中是否有属性时,如果没有属性,它会查看它的类.由于您从未设置过self.list_value,它正在访问在所有实例之间共享的类变量,因此任何修改都将反映在每个其他对象中.