[英]Why does this happen with classes
我寫了下面的課,它做以下事情:
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
持有的價值觀。 可能是什么原因
你為什么會這樣認為呢? 首先,您將lastval
分配為指向與lastval
相同的列表,這樣一個self.Values
就會在另一個self.Values
中看到。 但是,當您執行lastval = []
您只需將lastval
重新綁定到新列表,就根本不會影響self.Values
。
__init__
方法運行后,內存中有兩個對象:
#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.Value現在引用了不同的對象。
要了解的重要一點是區別在於更新變量以引用不同的對象以及對現有對象進行突變。 有關深入的討論,請參見http://docs.python.org/3/reference/datamodel.html (該文檔適用於Python 3,但是Python 2和Python 3在這些概念上沒有主要區別。)
類與此無關(或不多)。 潛在的影響是幾個變量可以保存相同的列表(這通過分配發生)。 然后,如果您更改列表,則所有變量似乎都會更改。
您可能想要創建列表的副本來避免這種情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.