python中的静态类变量-lists 和 objects

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

但是有没有更清洁/更传统的方法?有人能解释为什么会这样吗?


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

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