2015-09-18 113 views
1

所以,在我的程序中,我有一個「主」功能,它改變給定矩陣的兩個元素。矩陣是列表中的一個元素(在該示例中列表是變量solved),然後我想追加三個新元素。Python:帶參數的矩陣函數

def main(matrix,direction): 
    index16 = indexOf(16,matrix) 
    matrix[index16[0]][index16[1]],matrix[index16[0]-1][index16[1]]=matrix[index16[0]-1][index16[1]],matrix[index16[0]][index16[1]] 

    return matrix 

solved = [[[2,1,3,4], 
     [5,6,7,8], 
     [9,10,11,12], 
     [13,14,15,16] 
     ]] 

not_solved = [[0,"up"], 
      [0,"left"] 
      ] 

while not_solved: 
    solved.append(main(solved[not_solved[0][0]],not_solved[0][1])) 
break 

當我執行程序時,我可以看到「求解」數組。然而,初始矩陣與開始時保持相同。

[[[2, 1, 3, 4], [5, 6, 7, 8], [9, 10, 11, 16], [13, 14, 15, 12]], 
[[2, 1, 3, 4], [5, 6, 7, 8], [9, 10, 11, 16], [13, 14, 15, 12]]] 

我該如何修復?

對不起,我的英文。我仍在學習。

+1

您可以添加預期的輸出嗎? –

+0

你還在某處定義了'indexOf'嗎? – tom

+0

Ahsanul它是threre, – VGad

回答

1

你需要你的矩陣副本中main所以原來矩陣不改變

import copy 

def main(matrix,direction): 
    matrixcopy = copy.deepcopy(matrix) 
    index16 = indexOf(16,matrixcopy) 
    matrixcopy[index16[0]][index16[1]],matrixcopy[index16[0]-1][index16[1]]=matrixcopy[index16[0]-1][index16[1]],matrixcopy[index16[0]][index16[1]] 
    return matrixcopy 

Returns:

[[[2, 1, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]], 
[[2, 1, 3, 4], [5, 6, 7, 8], [9, 10, 11, 16], [13, 14, 15, 12]]] 
+0

非常感謝。 – VGad

0

的問題是你的主要功能

def main(matrix,direction): 
    index16 = indexOf(16,matrix) 
    matrix[index16[0]][index16[1]],matrix[index16[0]-1][index16[1]]=matrix[index16[0]-1][index16[1]],matrix[index16[0]][index16[1]] 

    return matrix 

在這個函數你返回矩陣,但你也改變矩陣,這是你原來的矩陣。

考慮一個簡單的例子:

>>> a=[1,2,3] 
>>> def test(b): 
    b[1]=4 
    return b 
>>> c = test(a) 
>>> c 
[1, 4, 3] 
>>> a 
[1, 4, 3] 

一個可能的解決方案是使用拷貝模塊

>>> import copy 
>>> a=[1,2,3] 
>>> def test(b): 
    c=copy.deepcopy(b) 
    c[1]=4 
    return c 

>>> c = test(a) 
>>> c 
[1, 4, 3] 
>>> a 
[1, 2, 3]