簡體   English   中英

為什么在課堂上會發生這種情況

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM