Python列表分配不起作用

时间:2015-04-03 01:37:40

标签: python list append

所以我有一个列表,在for循环中,我附加了一组结构为列表的坐标,但是一旦返回,它只包含最后生成的坐标,它将替换主列表中的所有其他项。 仔细检查后,每次附加某些内容时,它都会用当前坐标替换主列表中的所有项目。 为什么? 源代码可能不会有帮助,它的确如此。 谢谢! 这里有一些代码:

def createLab(size=16):
maze = createMaze()
answerPath=[]
visual=['o']*(size**2)
pos=[(size**2)/2,(size**2)/2]
lat='north'
for move in maze:
    #print move, lat, pos
    #print answerPath
    answerPath.append(pos)
    #answerPath='[%s, %s]' % (answerPath,pos)
    if move=='straight':
        if lat=='north': pos[1]=pos[1]+size
        elif lat=='south': pos[1]=pos[1]-size
        elif lat=='east': pos[0]=pos[0]+1
        elif lat=='west': pos[0]=pos[0]-1

    elif move=='left':
        if lat=='north': pos[1]=pos[1]-1; lat='west'
        elif lat=='south': pos[1]=pos[1]+1; lat='east'
        elif lat=='east': pos[0]=pos[0]+size; lat='north'
        elif lat=='west': pos[0]=pos[0]-size; lat='south'

    elif move=='right':
        if lat=='north': pos[1]=pos[1]+1; lat='east'
        elif lat=='south': pos[1]=pos[1]-1; lat='west'
        elif lat=='east': pos[0]=pos[0]-size; lat='south'
        elif lat=='west': pos[0]=pos[0]+size; lat='north'
    #print pos
    #print; print
return answerPath, maze, pos

2 个答案:

答案 0 :(得分:1)

您正在循环之前创建一个pos列表,并且您反复将pos完全相同的answerPath追加到pos,并修改相同的{{1}一遍又一遍。

作为解决方案,在每次迭代开始时创建一个新的pos,使用切片表示法制作浅表副本:

def createLab(size=16):
    maze = createMaze()
    answerPath=[]
    visual=['o']*(size**2)
    pos=[(size**2)/2,(size**2)/2]
    lat='north'
    for move in maze:
        pos = pos[:] #pos is now a new list with the same values as the previous pos
        #Alternatively: pos = list(pos)
        answerPath.append(pos)

        if move=='straight':
            if lat=='north': pos[1]=pos[1]+size
            elif lat=='south': pos[1]=pos[1]-size
            elif lat=='east': pos[0]=pos[0]+1
            elif lat=='west': pos[0]=pos[0]-1

        elif move=='left':
            if lat=='north': pos[1]=pos[1]-1; lat='west'
            elif lat=='south': pos[1]=pos[1]+1; lat='east'
            elif lat=='east': pos[0]=pos[0]+size; lat='north'
            elif lat=='west': pos[0]=pos[0]-size; lat='south'

        elif move=='right':
            if lat=='north': pos[1]=pos[1]+1; lat='east'
            elif lat=='south': pos[1]=pos[1]-1; lat='west'
            elif lat=='east': pos[0]=pos[0]-size; lat='south'
            elif lat=='west': pos[0]=pos[0]+size; lat='north'
    return answerPath, maze, pos

如果您的示例和我的pos实际上发生了什么,我建议您阅读Wesley Chun's excellent slides on Python's Memory Model

答案 1 :(得分:0)

没有代码,我们无法真正帮助你。从您的描述中,听起来好像您没有将新坐标附加到列表中,而是写在同一列表上。

请向我们提供相关代码。

在代码中尝试类似.append的内容。例如。

list = [one,two,three]

list.append(4)

打印(列表)

print现在应该为您提供以下结果。

一,二,三,四

我希望这对你有所帮助。