Skip to main content
 首页 » 编程设计

python之为什么列表无缘无故更改

2025年05月04日11sky-heaven

我将一个列表的副本传递给一个函数,但由于某种原因原始列表发生了变化。我尽了我所能,但这是完全不合逻辑的,或者我做错了什么。

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 

我想知道为什么网格实际上在变化。

请您参考如下方法:

您的网格变量是一个二维数组,即列表列表。当您执行 grid[:] 时,您正在创建一个新的列表列表,但元素本身仍然是对同一迷宫行的引用。你想做一个深层复制,例如copy 模块中的 deepcopy 函数。