1

リストのコピーを関数に渡しましたが、何らかの理由で元のリストが変更されました。できる限りのことを試しましたが、これは完全に非論理的であるか、本当に間違ったことをしました。

maze="""XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXX            XXXXXXXXXXXXXXXXXXXXX EXX
XXXXXXXXXXXXXX XXX          XXXX     XXX
XX XX           XXX XXXXXXX XXXX XXXXXXX
XX XX XXXXXXXXX XX  XXXXXXX XXXX XXXXXXX
XX XX XXXXXXX XXXXX XXXXXXX XXXX XXXXXXX
XX XX XXXX    XXXXX XXXXX             XX
XX XX XXXX XX XXXXX   XXX XXXXXXXXXXXXXX
XX XX XXXX XX XXXXXXX XXX     XXXX    XX
XX XX      XX     XXX XXXXXXX XXXX XX XX
XX XXXXXXXXXX XXX XXX XXXXXXX      XXXXX
XX      XXXXX XXX XXXXXX      XXXX XXXXX
XXXX XX XXXXX XXX XX     XXXX XXXX   XXX
XXXX XX XXXXX XXX XX XXXXXXXX XXXXXX XXX
XX   XX XXX   XXX XX XXXXX      XXXX XXX
XXXX XX     XXXXX    XXXXX XXXXXXX XXXXX
XXXX XXXXXXXXXXXXXXXXXXXXX XXXXXXX   XXX
XXXX                XXX        XXXXX XXX
XXXXXXXXXXXXXXXX XXXXXX XXXXXX XXXXX XXX
XXX              XXXXXX XXXXXX XXXXX XXX
XXX XXXXXXXXXXXXXXXXX   XX     XXXXX  XX
XXX             XX XX XXXX XXXXXXXXXX XX
XS  XXXXXXXX XXXXX    XXXX            XX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"""
grid=maze.split("\n")
for x in xrange(len(grid)):
    grid[x]=list(grid[x])
row=len(grid)
col=len(grid[0])
def check(maze,x,z,row,col):
    lim=0
    if z+1<col and maze[x][z+1]=="X":
        lim+=1
    if x+1<row and maze[x+1][z]=="X":
        lim+=1
    if z-1>=0 and maze[x][z-1]=="X":
        lim+=1
    if x-1>=0 and maze[x-1][z]=="X":
        lim+=1
    return lim
def get_pos(grida,row,col):
    for l in xrange(100):
        for x in xrange(len(grida)):
            for z in xrange(len(grida[x])):
                if check(grida,x,z,row,col)>=3 and grida[x][z]!="E" and grida[x][z]!="S":
                    grida[x][z]="X"
                else:
                    continue
    return grida
grid_temp=grid[:]
print grid
grid_2=get_pos(grid_temp,row,col)
print grid

グリッドが実際に変化する理由を知りたいです。

4

3 に答える 3

10

グリッド変数は 2D 配列、つまりリストのリストです。これを行うgrid[:]と、リストの新しいリストが作成されますが、要素自体は同じ迷路行への参照のままです。deepcopyモジュールからの関数など、ディープコピーを実行したいcopy

于 2013-05-27T14:06:50.337 に答える
1

簡単な解決策、copyアドホックコピーの代わりにモジュールを使用:

import copy
foo = copy.deepcopy(bar)

あなたの質問に答えるために、なぜあなたのコードの次のビットに行き着くのかと思います:

grida[x][y] = ...

あなたの[:]コピーは 1 レベルの深さしかコピーしませんが、割り当ては 2 レベルの深さです。

于 2013-05-27T14:09:36.380 に答える