2017-10-16 44 views
0

我使用對象的列表在python具有一個問題:在Python對象,使用的方法的一個元件上的列表適用方法整個列表

我聲明瞭對象的列表如下:

chain = [Node(1), Node(2), Node(3), 
    Node(4), Node(5), Node(6), 
    Node(7), Node(8), Node(9)] 

與節點是一個簡單的類:

class Node: 

def __init__(self, data, links = []): 
    self.node_links = links 
    self.node_data = data 

def add_link(self, link): 
    self.node_links.append(link) 
(...) 
def to_str(self): 
    s = "node nb " + str(self.node_data) + " linked to:" 
    for link in self.node_links: 
     s += " Node " + str(link.node_to.node_data) 
    return s 
(...) 

一切正常,從這裏開始,除非我使用的方法add_link()的元素在我的名單「產業鏈」,它執行方法在所有e我的鏈條悠閒。

例如,

chain[0].add_link(Link(chain[3], 0.25)) 

for e in chain: 
    print(e.to_str()) 

將輸出

node nb 1 linked to: Node 4 
node nb 2 linked to: Node 4 
node nb 3 linked to: Node 4 
node nb 4 linked to: Node 4 
node nb 5 linked to: Node 4 
node nb 6 linked to: Node 4 
node nb 7 linked to: Node 4 
node nb 8 linked to: Node 4 
node nb 9 linked to: Node 4 

我名單中所有的元素似乎已經影響我的發言。

我對此很困惑。我試過到處搜索(代碼&互聯網),但我找不到我做錯了什麼。有人有想法嗎?

+0

http://docs.python-guide.org/en/latest/writing/gotchas/#mutable-default-arguments –

+0

它可能看起來奇怪的是,Python有這種行爲,但它在某些情況下可能會有用,例如充當緩存。儘管如此,如果你想使用可變默認參數,這是一個好主意,可以評論你是故意調用該行爲。否則,讀取你的代碼的人可能會認爲它是一個錯誤。 –

+0

感謝大家。事實上,即使我的IDE警告過我關於可變參數的問題,作爲一個noob我忽略了這個警告,我應該看看它。 –

回答

0

按照邁克爾·布切爾在註釋中提供的鏈接,當你做

def __init__(self, data, links = []): 

同樣[]被使用,所以所有的節點都引用相同的列表。您可以將您的構造函數更改爲:

def __init__(self, data, links=None): 
    self.node_links = links or [] 
    self.node_data = data 
相關問題