问题更改列表列表中的单个项目 - Python

时间:2015-04-10 14:41:51

标签: python list python-3.x nested-lists

好。所以我在编程基础知识和最终项目中我们必须设计一个带有地图的游戏。我创建了一个程序,用于创建十个列表的列表,每个列表中包含十个项目。但是,当我尝试更改一个列表中的单个项目(例如mapGrid[4][5] = "i")时,它会更改所有列表中的所有第6个项目。 以下是我用来测试它的代码:

import random

def createMap():

    mapGrid = []
    col = []
    randx = 0
    randy = 0
    i = 0

    for x in range(0,10):
        col += "#"

    for y in range(0,10):
        mapGrid.append(col)

    while i < 10:
        randx = random.randint(0,9)
        randy = random.randint(0,9)
        if mapGrid[randx][randy] != "i":
            mapGrid[randx][randy] = "i"
            i += 1

    return mapGrid

def printMap(x,y,mapGrid):

    mapGrid[x][y] = "0"

    print("",mapGrid[x-1][y+1],mapGrid[x][y+1],mapGrid[x+1][y+1],"\n",
          mapGrid[x-1][y],mapGrid[x][y],mapGrid[x+1][y],"\n",
          mapGrid[x-1][y-1],mapGrid[x][y-1],mapGrid[x+1][y-1])

examp = createMap()
print(examp)
print("")
printMap(4,4,examp)

我得到的结果是:

[['i', 'i', 'i', 'i', 'i', 'i', 'i', 'i', 'i', 'i'], ['i', 'i', 'i', 'i', 'i', 'i', 'i', 'i', 'i', 'i'], ['i', 'i', 'i', 'i', 'i', 'i', 'i', 'i', 'i', 'i'], ['i', 'i', 'i', 'i', 'i', 'i', 'i', 'i', 'i', 'i'], ['i', 'i', 'i', 'i', 'i', 'i', 'i', 'i', 'i', 'i'], ['i', 'i', 'i', 'i', 'i', 'i', 'i', 'i', 'i', 'i'], ['i', 'i', 'i', 'i', 'i', 'i', 'i', 'i', 'i', 'i'], ['i', 'i', 'i', 'i', 'i', 'i', 'i', 'i', 'i', 'i'], ['i', 'i', 'i', 'i', 'i', 'i', 'i', 'i', 'i', 'i'], ['i', 'i', 'i', 'i', 'i', 'i', 'i', 'i', 'i', 'i']]

 i i i
 0 0 0 
 i i i
而不是有十个单身的和一个&#39; 0&#39;它变成了我所有的,每个列表中的每个第5项都是0。

如何修复它,以便我只更改单个项目而不是每个列表中的项目?

3 个答案:

答案 0 :(得分:1)

您要多次附加相同的col列表,您希望每次都创建一个新副本:

mapGrid.append(col[:]) # a copy of col

请参阅live example

答案 1 :(得分:0)

您将相同列表col的10倍添加到地图网格中,每次都不是副本。因此,while循环中的每个更改都会以相同的方式影响mapGrid中的每个列/子列表 - 而不仅仅是其中一个。

更改

for y in range(0,10):
        mapGrid.append(col)

for y in range(0,10):
        mapGrid.append(list(col))

输出

[['i', '#', '#', '#', '#', '#', '#', '#', '#', '#'], ['#', '#', '#', '#', 'i', '
#', 'i', '#', '#', '#'], ['#', '#', '#', '#', '#', '#', '#', '#', '#', '#'], ['#
', '#', '#', '#', '#', '#', '#', '#', '#', '#'], ['#', '#', '#', '#', '#', '#',
'i', '#', '#', '#'], ['#', '#', '#', '#', 'i', '#', '#', 'i', '#', '#'], ['#', '
#', '#', '#', '#', 'i', '#', '#', '#', '#'], ['#', '#', 'i', '#', '#', '#', '#',
 '#', '#', '#'], ['#', 'i', '#', '#', '#', '#', '#', '#', '#', '#'], ['#', '#',
'#', '#', '#', 'i', '#', '#', '#', '#']]

('', '#', '#', '#', '\n', '#', '0', 'i', '\n', '#', '#', '#')

答案 2 :(得分:0)

问题是你已经在同一个列表中创建了一个包含10个引用的列表,其中包含:

for y in range(0,10):
    mapGrid.append(col)

每次都需要构建一个列表 - 您可以使用col[:]this FAQ entry执行此操作,或者使用{{1}明确构建新列表}}