Python中的静态类变量——列表&;物体

Python中的静态类变量——列表&;物体,python,list,static,static-variables,class-variables,Python,List,Static,Static Variables,Class Variables,我是Python新手,更多的是Java背景。我理解Python中静态类变量的概念,但我注意到列表和对象的工作方式与字符串不同,例如,它们在类的实例之间共享 换言之: class box (): name = '' contents = [] def __init__ (self, name): self.name = name def store (self, junk): self.contents.append(junk)

我是Python新手,更多的是Java背景。我理解Python中静态类变量的概念,但我注意到列表和对象的工作方式与字符串不同,例如,它们在类的实例之间共享

换言之:

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
现在,如果我创建两个实例并尝试向其中添加内容:

a = box('Box A')
b = box('Box B')

a.store('apple')
b.store('berry')

print a.open()
print b.open()
输出:

['apple','berry']
['apple','berry']
很明显,它们在box的两个实例之间共享

现在,我可以通过执行以下操作来解决此问题:

def store (self, junk):
    temp = self.contents
    temp.append(junk)
    self.contents = temp

但是有没有更干净/更传统的方法?有人能解释为什么会发生这种情况吗?

在您的案例中,这两个变量都是类变量。但是,您为对象A和B设置了不同的字符串,实际上您正在再次初始化它们。另一方面,列表不会再次初始化,因此对象A和B中的列表都指向内存中的同一对象。因此,追加项会将项追加到内存中的同一列表中。因此,结果是

您想写以下内容:

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

关键字
self
使它们独立,就像您说的self.name属于
box()的当前实例一样。
类:

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

你可能会发现有用的。太好了!我想我并没有像我想的那样理解这些概念。非常感谢。