2011-10-25 55 views
3

我有一个对象的问题。创建新的python对象似乎是相同的对象

下面的代码

class Data: 
    def __init__(self,data=[]): 
     self.data = data 
    def add(self,data): 
     self.data.extend(data) 

class Parent: 
    def testa(self): 
     a = Data() 
     a.add('a') 
     print a.data 
    def testb(self): 
     b = Data() 
     b.add('b') 
     print b.data 

if __name__ == "__main__": 
    p = Parent() 
    p.testa() 
    p.testb() 

生成以下的输出:

[] 
['a'] 
['a'] 
['a', 'b'] 

为什么是不是有新的对象产生的? testb中的第二次看起来旧的Data对象仍然存在,尽管它在一个私有变量中。

如何更改代码以创建新对象?

+0

不要忘记接受一个适合您的答案,只需点击绿色的选中标记即可。 –

回答

10

使用[]作为函数的默认参数将只创建一次列表,并在每次调用时重新使用此列表。有关说明,请参阅http://docs.python.org/tutorial/controlflow.html#default-argument-values。因此,两个Data对象共享由其成员self.data引用的列表!

你应该修改你的代码是这样的:

class Data: 
    def __init__(self, data=None): 
     if data is None: 
      data=[] 
     self.data = data 
    def add(self, data): 
     self.data.extend(data) 

这应该可以解决您的问题。

+0

@BartVanherck,如果这解决了您的问题,您应该将此答案标记为解决方案。 – danihp