2013-02-11 115 views
2

我來自堅實的C/C++背景,所以如果我的問題很愚蠢,請耐心等待。追加到同一個列表

在這裏我有一個聲明來封裝數據的兩個班,

class Node: 
    Term = "" 
    TermInfo = [] 
    def __init__(self,S,Info): 
     self.Term = S 
     self.TermInfo.append(Info) 

class TermInfo: 
    DocID = 0 
    Freq = 0 
    def __init__(self,ID,F): 
     self.DocID = ID 
     self.Freq = F 

和我試圖操縱他們這樣

Info = TermInfo(ID,0) 
node = Node(j,Info) 
Dict[j] = node 

基本上我試圖構建一個包含節點的字典,由一個字符串「Term」和一個「Terminfo」列表組成,我期待每個節點都有自己的副本。然而,當我連續打了兩次三線

Info = TermInfo(ID,0) 
node = Node(j,Info) 
Dict[j] = node 

Info = TermInfo(ID,0) 
node = Node(j,Info) 
Dict[j] = node 

我很驚訝地看到,「TERMINFO」兩個列表分別指向了同一個內存地址,第二個追加()也改變了第一單那麼,如何確保每個節點都有自己的副本,而不是指向相同的地址?由於

回答

4

簡短的回答:

__init__創建一個新的列表。

def __init__(self,S,Info): 
    self.Term = S 
    self.TermInfo = [Info] 

龍答:

這與蟒蛇如何查找屬性做。當你這樣做:instance.attribute,python首先查找實例上的屬性。如果沒有找到它,它會在上查找屬性。在這裏你有一個類的列表屬性,並且你通過實例繼續追加到該屬性。所以當你有這條線:

self.TermInfo.append(whatever) 

Python首先看自我。但是,self沒有TermInfo屬性,因此python在屬性中查找self.__class__(在這種情況下爲Node) - 並且它找到它,因此它附加到Node.TermInfo列表。

0

只有在__init__和對象構造後分配的屬性纔是實例屬性。類定義中分配的屬性是類屬性,類似於其他語言中的靜態類成員。因此,如果您想擁有每個實例屬性,請在__init__中指定其初始值。