我是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)
结果
0====
value : default
=====
1====
value : A
A
=====
2====
value : A
A
=====
3====
value : default
A
=====
但测试的最后结果与我在上次测试中的预期不同。 'b'实例的'list_value'中不应该有“A”。 它刚刚创建,从未添加过“A”。 我在'a'的实例中加了'A',而不是'b'。 但结果告诉我'b'中也有'A' 更重要的是,类中的'list_value'和'value'的工作方式不同。 看起来两者都有相同的语法。为什么他们的工作方式不同?
答案 0 :(得分:21)
实际上,这些是类变量。要创建实例变量,请在__init__
函数中初始化它们:
class Chaos:
def __init__(self):
self.list_value = []
self.value = "default"
value
的行为与实例变量相似的原因是因为您使用self.value
进行设置。当Python看到self.X
时,它会查看对象中是否有属性X
,如果没有,则会查看其类。由于您从未设置self.list_value
,因此它正在访问在所有实例之间共享的类变量,因此任何修改都将反映在每个其他对象中。
答案 1 :(得分:3)
关键区别在于您要追加到list_value
,并且您要分配给value
。它们被称为“类变量”。每个实例都有自己对类变量的引用,这就是共享列表的原因。但是,在分配时,您正在将该实例的引用更改为指向另一个变量,这解释了value
的行为。
如果要查找来自list_value
的实例变量行为,请在构造函数(名为__init__
的类方法)中初始化它。