2013-10-31 135 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

相關問題