2013-10-31 58 views
1

我写了下面的类类,其执行以下操作:为什么会出现这种情况与

class abc: 
    def __init__(self): 
     self.Values = [] 
    def add_code(self): 
     lastval = self.Values 
     print "self.Values , ", self.Values 
     print "lastval , ", lastval 
     lastval.append(1) 
     print "self.Values 1, ", self.Values 
     print "lastval 1 , ", lastval 

     lastval.append(2) 
     print "lastval 2 , ", lastval 
     print "self.Values 2 , ", self.Values 
     lastval.append(3) 
     print "lastval 3 , ", lastval 
     print "self.Values 3 , ", self.Values 
     lastval.append(4) 
     print "last val 4 ", lastval 
     print "self.Values 4 , ", self.Values 
     lastval = [] 
     print "last value is emtpy now? , ", lastval 
     print "But the self.Values is not", self.Values 
     return lastval 

当我运行这段代码我看到变量lastval获取与价值附加等做了self.Values 但是,当我初始化为空列表lastval,我仍然看到self.Values持有的值。 可能是什么原因

回答

7

你为什么会这么想?起初,您将lastval指定为指向与self.Values相同的列表,因此可以在另一个中看到一个突变。但是当你做lastval = []时,你只需将lastval重新绑定到一个新列表中,根本不会影响self.Values

0

类没有(或没有太多)这样做。潜在的影响是几个变量可以保持相同的列表(这通过赋值来实现)。如果你改变列表,所有变量似乎都会改变。

您可能想要创建列表的副本以避免这种情况。该__init__方法运行

4

后,我们在内存中有两个对象:

#1 Instance of abc 
#2 Array 

它们包括:

#1 Instance of abc 
    Values : Reference to #2 

#2 Array 
    [ ] 

现在我们调用add_code,它运行:

lastval = self.Values 
print "self.Values , ", self.Values 
print "lastval , ", lastval 

在这一点上,lastval和self.Values是参考文献到对象#2,数组。因此,我们有:

#1 Instance of abc 
    Values : Reference to #2 

#2 Array 
    [ ] 

Local variables 
    self : Reference to #1 
    lastval : Reference to #2 

继续...

lastval.append(1) 
print "self.Values 1, ", self.Values 
print "lastval 1 , ", lastval 

append方法修改对象2#。所以现在我们有:

#1 Instance of abc 
    Values : Reference to #2 

#2 Array 
    [ 1 ] 

Local variables 
    self : Reference to #1 
    lastval : Reference to #2 

这同样继续...

lastval.append(2) 
print "lastval 2 , ", lastval 
print "self.Values 2 , ", self.Values 
lastval.append(3) 
print "lastval 3 , ", lastval 
print "self.Values 3 , ", self.Values 
lastval.append(4) 
print "last val 4 ", lastval 
print "self.Values 4 , ", self.Values 

所以现在我们有:

#1 Instance of abc 
    Values : Reference to #2 

#2 Array 
    [ 1, 2, 3, 4 ] 

Local variables 
    self : Reference to #1 
    lastval : Reference to #2 

在这一点上,我们做不同的事情:

lastval = [] 

这是一个本地任务变量。它没有做任何事情来反对#2。它创建一个新的数组。所以最后我们:

#1 Instance of abc 
    Values : Reference to #2 

#2 Array 
    [ 1, 2, 3, 4 ] 

#3 Array 
    [ ] 

Local variables 
    self : Reference to #1 
    lastval : Reference to #3 

正如你所看到的,lastval和self.Values现在引用不同的对象。

要理解的重要之处在于更新变量以引用不同对象和变异现有对象的差异。有关详细讨论,请参见http://docs.python.org/3/reference/datamodel.html(该文档适用于Python 3,但Python 2和Python 3之间在这些概念方面没有太大区别。)

+0

这是非常详细的解释...我将确保保存你的回应 – user2927392

相关问题