【问题标题】:Python list generator not working as intendedPython 列表生成器未按预期工作
【发布时间】:2017-06-26 03:00:36
【问题描述】:

首先,我正在制作一个地图是列表列表的游戏:

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() 中,但我似乎找不到它,有什么想法吗?

【问题讨论】:

  • 您的列表不是 Python 语法。引号和逗号太少或太多。

标签: python list printing


【解决方案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 = [] 创建的相同列表,因此无论何时修改@987654327 @ 更改将反映在所有三个“行”中的Map,因为每个“行”都是Row!。

相反,尝试类似:

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

【讨论】:

    猜你喜欢
    • 2020-06-23
    • 2018-10-13
    • 2021-08-01
    • 1970-01-01
    • 2021-11-19
    • 2020-02-03
    • 2020-08-21
    • 1970-01-01
    • 2018-08-08
    相关资源
    最近更新 更多