2012-10-16 64 views
0

所以我稱爲類細胞:從列表中的對象列表中刪除一個項目時,該項目也從其他對象名單中刪除

class cell: 
    possibles = [ "1", "2", "3", "4", "5", "6", "7", "8", "9" ] 
    value = None; 

    def __init__(self, value): 
     if value == "": 
      self.value = "0" 
     else: 
      self.value = value 

if __name__=="__main__": 
    mlist = [cell("2"), cell("6"), cell("8")] 
    mlist[2].possibles.remove("3") 
    print mlist[0].possibles 

輸出是:

['1', '2', '4', '5', '6', '7', '8', '9'] 

當我明確地從第三項中刪除它時,爲什麼它會從數組的第一項中刪除可能值?

回答

2

這是一個普通的Python的疑難雜症。每寫入cell的方式都有一個對同一個列表實例的引用。您可以通過打印id(mlist[i].possibles)來檢查每個i

要創建單獨的列表,將初始化到構造函數:

def __init__(self, value): 
    self.possibles = [ "1", "2", "3", "4", "5", "6", "7", "8", "9" ] 
+0

我希望我可以對此和帖子直接在下面進行修改。謝謝! – sjensen85

0

發生這種情況是因爲您已將possibilities定義爲類變量而非實例變量。

移動possibilities__init__(如self.possibilities),並且你應該罰款

1
mlist = [cell("2"), cell("6"), cell("8")] 

這裏你不必三個不同的名單,但三所引用相同的列表。任何變化都會影響所有

0

正如其他人所說,你應該使可能成爲一個實例變量。你也可以在沒有if ... else子句的情況下通過將值參數默認爲0.

class cell: 
     def __init__(self, value=0): 
      self.possibles = [ "1", "2", "3", "4", "5", "6", "7", "8", "9" ] 
      self.value = value 

    if __name__=="__main__": 
     mlist = [cell("2"), cell("6"), cell("8")] 
     mlist[2].possibles.remove("3") 


>>> mlist[0].possibles 
['1', '2', '3', '4', '5', '6', '7', '8', '9'] 
>>> mlist[2].possibles 
['1', '2', '4', '5', '6', '7', '8', '9'] 
>>>