2016-11-18 53 views
-2
def get_all_children(self): 
    zero = self.current_coords[0] 
    zero_row, zero_col = zero 
    states = [] 
    # blank spot is not on top row(middle or bottom) so we move up! 
    if zero_row > 0: 
     swapRow = zero_row - 1 
     tempState = copy.copy(self.current) # a list of list of strings 
     tempState[zero_row][zero_col], tempState[swapRow][zero_col] = tempState[swapRow][zero_col], tempState[zero_row][zero_col] 
     s = State(tempState) 
     states.append(s) 
    ## blank spot is not on the bottom row(middle or top) so we move down! 
    if zero_row < 2: 
     swapRow = zero_row + 1 
     tempState = copy.copy(self.current) 
     tempState[zero_row][zero_col], tempState[swapRow][zero_col] = tempState[swapRow][zero_col], tempState[zero_row][zero_col] 
     s = State(tempState) 
     states.append(s) 

我有一個State類,其中包含名爲'current'的列表,並且我試圖定義一個函數來獲取所有可能的子元素(移動)當前狀態。在第一個IF語句中,我創建當前變量(這是一個列表列表)的COPY並將其存儲在'tempState'列表中,然後我嘗試在該tempState上交換值,創建一個State對象,並將其傳入並然後將該對象附加到列表中。所有的工作正常。問題在於何時到達第二個IF語句。在我做了交換之後,它修改了原來的'當前'變量,即使我創建了一個副本!我無法弄清楚爲什麼。 我試過list(self.current),self.current [:],copy.cop(self.current)。請幫助Python原始列表被複制後仍被修改

+0

您是否閱讀過[文檔](https://docs.python.org/2/library/copy.html)? – BrenBarn

+0

請發佈'State'類的代碼,否則我們看不到您的引用錯誤的位置。 – KeatsKelleher

+0

正如BrenBarn所說的,如果您要複製列表列表,您需要'deepcopy()'。 – TemporalWolf

回答

1

您必須改用copy.deepcopy(x)。

+0

謝謝!我沒有想到這樣做,因爲我認爲這是因爲如果我想複製具有屬性的對象。 – David

相關問題