2015-06-12 45 views
1

我是Python的新手,拥有更多的Java背景。我理解Python中的静态类变量的概念,但是我注意到列表和对象不像字符串那样工作,例如 - 它们在类的实例之间共享。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'] 

这是非常清楚的,他们”在框的两个实例之间重新共享。

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

但有一个更清洁/更传统的方式:

现在我可以通过以下操作得到解决呢?有人能解释为什么发生这种情况吗

+1

你可能会发现[实例变量vs类变量](http://stackoverflow.com/questions/2714573/instance-variables-vs-class-variables-in-python)有用。 – kalhartt

回答

1

的关键词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 
+0

非常好!我想我不像我想的那样理解这些概念。 谢谢! – user1569175

+0

最受欢迎... :) –

0

这两个变量都是你的情况下的类变量。但是,您为对象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