Static class variables in Python — Lists & Objects
本问题已经有最佳答案,请猛点这里访问。
我是Python的新手,有更多的Java背景。我了解Python中静态类变量的概念,但我注意到列表和对象的工作方式与字符串不同,例如,它们在类的实例之间共享。
换言之:
1 2 3 4 5 6 7 8 9 10 11 12 13 | class box (): name = '' contents = [] def __init__ (self, name): self.name = name def store (self, junk): self.contents.append(junk) def open (self): return self.contents |
现在,如果我创建两个实例并尝试向它们添加内容:
1 2 3 4 5 6 7 8 | a = box('Box A') b = box('Box B') a.store('apple') b.store('berry') print a.open() print b.open() |
输出:
1 2 | ['apple','berry'] ['apple','berry'] |
很明显,它们是在Box的两个实例之间共享的。
现在,我可以通过执行以下操作来绕过它:
1 2 3 4 | def store (self, junk): temp = self.contents temp.append(junk) self.contents = temp |
但是有没有更清洁/更传统的方法?有人能解释为什么会这样吗?
关键字
1 2 3 4 5 6 7 8 9 10 11 | class box (): def __init__ (self, name): self.name = name self.contents = [] def store (self, junk): self.contents.append(junk) def open (self): return self.contents |
在您的例子中,这两个变量都是类变量。但是,您为对象A和B设置了不同的字符串,实际上您正在重新初始化它们。另一方面,列表不会再次初始化,因此对象A和B的列表都指向内存中的同一个对象。因此,附加项会将项附加到内存中的同一列表中。因此,结果。
你想写这个:
1 2 3 4 5 6 7 8 9 10 11 12 | class box (): def __init__ (self, name): self.name = name self.contents = [] def store (self, junk): self.contents.append(junk) def open (self): return self.contents |