2017-01-27 11 views
0

"パズル"として関数に渡されるリストは変更されており、関数はそれを同じにしておきたいと思います。関数がリストを変更するのを防ぐには?

"""moveDown() works by swapping the empty space with the block above it.""" 
def moveDown(xPosition, yPosition, puzzle): 
    returnPuzzle = list() 
    returnPuzzle.append(puzzle) 
    returnPuzzle = returnPuzzle[0] 

    if(puzzle[yPosition][xPosition]!=0): # is space we are moving the block into not empty? 
     return -1 
    if(yPosition-1<0): 
     return -1 

    print puzzle 
    #swap 
    returnPuzzle[yPosition][xPosition] = returnPuzzle[yPosition-1][xPosition] 
    returnPuzzle[yPosition-1][xPosition] = 0 
    print puzzle 

    return returnPuzzle 

最初print文は、関数に渡された元のpuzzleを返し、それはreturnPuzzle代わりにpuzzleに取り組んでいたかのように第二はそれを修正しました。どんな考え?

ファーストプリント:[[2, 1, 3], [6, 4, 5], [8, 7, 0]]

第二の印刷:だからあなたは、リストを作成し、それに値を追加し、リストからその値を取得[[2, 1, 3], [6, 4, 0], [8, 7, 5]]

+0

入力例を教えてください。 –

+0

moveDown(2、2、[[2,1,3]、[6,4,5]、[8,7,0]])は現在使用されているものです。 – user7479988

答えて

1

:あなたは、使用を元のリストに影響を与えずに変更することができますコピーを作成するにはあなたはただpuzzlereturnPuzzleに割り当てています。ネストされたリストなので、「ディープコピー」と呼ばれるものを作成する必要があります。他の回答は浅いコピーを指しています。ここではリストをコピーしますが、リストの項目は同じです。つまり、同じ内側リストを含む新しい外側リストになります。内側のリストに変異を起こしているので、それらのコピーも必要です。

これを行う最も簡単な方法は、copyモジュールである:

import copy 
def moveDown(xPosition, yPosition, puzzle): 
    returnPuzzle = copy.deepcopy(puzzle) 
2
returnPuzzle = list() 
returnPuzzle.append(puzzle) 
returnPuzzle = returnPuzzle[0] 

- これは全く効果がありません、 puzzleに直接アクセスするのとまったく同じことです。他のよう

returnPuzzle = puzzle[:] 

(つまり、リストの開始と終了のデフォルト値を使用して、リストのスライスです。)

+0

それは浅いコピーですが、少なくとも1レベル以上のものが必要なようです。 – user2357112

+0

あなたが提案したコードを使用しようとしましたが、残念ながらまだ動作しませんでした。ありがとう – user7479988

0

puzzleが2Dリストであるので、あなたがコピー中に保管されている内側のリストへの参照を避けるために、そのコピーを作成する必要があります。

def duplicate2dList(oldList): 
    newList = [] 

    for l in oldList: 
     newList.append(l[:]) 

    return newList 
関連する問題