2017-06-06 148 views
0

我試圖在python中實現最短路徑算法。當我嘗試連接路徑上的點時遇到了一些麻煩。Python類中的奇怪的東西?

我有一個名爲NODE 類我做這些節點的數組,然後創建這樣在他們新的節點:

nodes = [] 
for r in range (0, 3): 
    for c in range (0, 3): 
     nodes.append(NODE(c*WIDTH/20 + 30, r*HEIGHT/20 + 30, 10)) 

此創建的節點,這是很好的,我可以得出他們就好了。
起初,我試圖通過在NODE類中添加一個節點對象列表來連接它們。我遇到了一些問題,我認爲問題是遞歸類,所以要測試我做到了這一點。
連接是NODE類中的空白數組。

nodes[0].connections.append(0) 
print nodes[0].connections 

nodes[1].connections.append(1) 
print nodes[1].connections 
print nodes[0].connections 

這是我發現問題的地方,也許我只是在愚蠢,或者它是語言的東西?不知道,但我想我會問。

的輸出是這樣的:
[0]
[0,1]
[0,1]

正如你可以看到,我只在索引中加入1-目的是連接列表然而,當我打印內容時,我看到兩個......這讓我感到困惑。

+1

如果沒有看到包含實際的'NODE'類的[mcve],這真的很難回答。 – Kevin

+2

讓我猜測,'class Node'有一個靜態字段'connections',而不是在構造函數中初始化'connections'到一個新列表,這樣所有對象都共享一個連接列表?請顯示你的Node類。 – dhke

+1

我打算繼續說這是[可變默認參數]的副本(https://stackoverflow.com/questions/1132941/least-astonishment-and-the-mutable-default-argument)。 –

回答

3

Possibilty 1:您的代碼如下所示:

class NODE: 
    connections = [] 
    def __init__(self, value): 
     self.value = value 

nodes = [NODE(23), NODE(42)] 

nodes[0].connections.append(0) 
print nodes[0].connections 
nodes[1].connections.append(1) 
print nodes[1].connections 
print nodes[0].connections 

解決方案:類實例屬性應該被內__init__定義。如果在類級別定義connections,則NODE的每個實例將共享相同的一個connections列表。

class NODE: 
    def __init__(self, value): 
     self.value = value 
     self.connections = [] 

可能性2:您的代碼如下所示:

class NODE: 
    def __init__(self, value, connections = []): 
     self.value = value 
     self.connections = connections 

nodes = [NODE(23), NODE(42)] 

nodes[0].connections.append(0) 
print nodes[0].connections 
nodes[1].connections.append(1) 
print nodes[1].connections 
print nodes[0].connections 

解決方案:創建在參數列表中的默認值只有一次,所以NODE所有實例使用默認值將共享同一個列表。使用非可變標記值來指示沒有參數傳遞。 None通常適用於此任務。

class NODE: 
    def __init__(self, value, connections = None): 
     self.value = value 
     if connections is not None: 
      self.connections = connections 
     else: 
      self.connections = [] 
+0

是的,這是它。謝謝回答 !這也會解決我的其他問題! – suli