Python列表生成器无法正常工作

时间:2017-06-26 03:00:36

标签: python list printing

首先,我制作了一个游戏,其中地图是一个列表列表:

P1.Cmap = [
      ['0,'0',0'],
      ['0,'0',0'],
      ['0,'0',0'],
]

我有打印功能:

def render(): #render the map to player
    P1.Cmap[P1.y][P1.x] = P1.char
    j = 40 - len(P1.Cmap)
    p = int(j/2)
    l = len(P1.Cmap[0])
    print('\n' * p)
    print('-' * l)
    for r in P1.Cmap:
        print(''.join(r))
    print('\n' * p)

其中P1是玩家对象,char是代表它的角色(X)

我还创建了一个使用给定参数生成地图的函数:

def newMap():
    Nmn = input('What is the name of the map? ')
    NmSx = input('What is the size you want?(X) ')
    NmSy = input('What is the size you want?(Y) ')
    Row = []
    Map = []
    for r in range(int(NmSx)):
        Row.append('0')
    for c in range(int(NmSy)):
        Map.append(Row)
    P1.Cmap = Map
    print(P1.Cmap)

但是当我将玩家X和Y设置为P1.x = 1,P1.y = 0并且我使用该函数生成地图时,它实际上会打印出来:

0X0
0X0
0X0

而不是"应该" (当我像上面的第一个代码块一样制作地图时):

0X0
000
000

我认为问题不在render()中,而是在newMap()中,但我似乎无法找到它,任何想法?

1 个答案:

答案 0 :(得分:1)

您正在通过以下方式创建P1.Cmap

Row = []
Map = []
for r in range(int(NmSx)):
    Row.append('0')
for c in range(int(NmSy)):
    Map.append(Row)
P1.Cmap = Map

但是,这会使Map等于[Row, Row, Row],也就是说,Row 总是引用您在上面使用Row = []创建的相同列表因此,每当您修改Row时,更改都会反映在所有三个“行”的Map中,因为每个“行”都是Row !.

相反,尝试类似:

X = int(NmSx)
Y = int(NmSy)
Map = [['0' for _ in range(X)] for _ in range(Y)]