好。所以我在编程基础知识和最终项目中我们必须设计一个带有地图的游戏。我创建了一个程序,用于创建十个列表的列表,每个列表中包含十个项目。但是,当我尝试更改一个列表中的单个项目(例如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。
如何修复它,以便我只更改单个项目而不是每个列表中的项目?
答案 0 :(得分:1)
答案 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}明确构建新列表}}