Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中,有没有一种方法可以在不使用一个值填充整个数组的情况下,使用特定模式将自动值分配给一个2D数组?_Python_Arrays - Fatal编程技术网

在Python中,有没有一种方法可以在不使用一个值填充整个数组的情况下,使用特定模式将自动值分配给一个2D数组?

在Python中,有没有一种方法可以在不使用一个值填充整个数组的情况下,使用特定模式将自动值分配给一个2D数组?,python,arrays,Python,Arrays,我正在尝试创建一个非常基本的类似蛇的控制台游戏,只是为了测试Python的功能,但是我在创建用于设置游戏地图的算法时遇到了问题。我需要将贴图边框设置为“#”,将贴图主体设置为空格”,但由于某种原因,即使在决定性的if函数中打印出结果后,整个贴图仍显示为散列。代码如下: class GameMap: def __init__(self): self.border_icon = '#' self.body_icon = ' ' self.x_size = 0 self

我正在尝试创建一个非常基本的类似蛇的控制台游戏,只是为了测试Python的功能,但是我在创建用于设置游戏地图的算法时遇到了问题。我需要将贴图边框设置为“#”,将贴图主体设置为空格”,但由于某种原因,即使在决定性的if函数中打印出结果后,整个贴图仍显示为散列。代码如下:

class GameMap:
def __init__(self):
    self.border_icon = '#'
    self.body_icon = ' '
    self.x_size = 0
    self.y_size = 0
    self.map_grid = []

def create_grid(self, map_size):
    if map_size == 1:
        self.x_size = 40
        self.y_size = 20
    elif map_size == 2:
        self.x_size = 80
        self.y_size = 40
    else:
        self.x_size = 120
        self.y_size = 60

    self.map_grid = [[None]*self.x_size]*self.y_size

    for row in range(self.y_size):
        for column in range(self.x_size):
            if row==0 or row==self.y_size-1 or column==0 or column==self.x_size-1:
                print('set: '+self.border_icon)
                self.map_grid[row][column] = self.border_icon
            else:
                print('set: '+self.body_icon)
                self.map_grid[row][column] = self.body_icon

def setup(self, map_type):
    map_templates = {
        1: 'Small Map (40x20)',
        2: 'Medium Map (80x40)',
        3: 'Big Map (120x60)'
    }
    if map_type not in map_templates:
        print('Invalid map type, starting a game with the default configuration...')
        map_type = 1

    print('Starting game: '+map_templates.get(map_type,'Invalid map type'))
    self.create_grid(map_type)
这是map类,为了访问它,我只需创建一个map对象并调用设置。
问题是,每当我显示矩阵时,整个地图都会被“#”填充,而没有任何空格。这有什么原因吗?

问题不在循环的
中,但问题在这一行:

self.map_grid = [[None]*self.x_size]*self.y_size
假设您的
self.x_size
为5,而
self.y_size
为10,则此行的计算结果如下:

[[None, None, None, None, None]] * 10
此时,您有一个列表引用了内部列表(这是它唯一的元素)。现在,如果您乘以
self.y_size
,您只会得到9个(在本例中)对内部列表的引用。这是新Python开发人员之间的一个非常常见的误解

您的问题有两种可能的解决方案:

嵌套列表理解:

self.map_grid = [[None for _ in range(self.x_size)] for _ in range(self.y_size)]

self.map_grid = [[None] * self.x_size for _ in range(self.y_size)]

问题不在循环的
中,而是在这一行中:

self.map_grid = [[None]*self.x_size]*self.y_size
假设您的
self.x_size
为5,而
self.y_size
为10,则此行的计算结果如下:

[[None, None, None, None, None]] * 10
此时,您有一个列表引用了内部列表(这是它唯一的元素)。现在,如果您乘以
self.y_size
,您只会得到9个(在本例中)对内部列表的引用。这是新Python开发人员之间的一个非常常见的误解

您的问题有两种可能的解决方案:

嵌套列表理解:

self.map_grid = [[None for _ in range(self.x_size)] for _ in range(self.y_size)]

self.map_grid = [[None] * self.x_size for _ in range(self.y_size)]

我刚换了块:

 for row in range(self.y_size):
    for column in range(self.x_size):
        if row==0 or row==self.y_size-1 or column==0 or column==self.x_size-1:
            print('set: '+self.border_icon)
            self.map_grid[row][column] = self.border_icon
        else:
            print('set: '+self.body_icon)
            self.map_grid[row][column] = self.body_icon
我认为这是可行的

    row=0
    column=0
    while(row<=self.x_size):
        while(column<=self.y_size):
            if row==0 or row==self.x_size:
                print("#",end="")
            elif column==0 or column==self.y_size:
                print("#",end="")
            else:
                print(" ",end="")
            column=column+1
        column=0
        print()
        row=row+1
行=0
列=0

而(row我刚刚更改了该块:

 for row in range(self.y_size):
    for column in range(self.x_size):
        if row==0 or row==self.y_size-1 or column==0 or column==self.x_size-1:
            print('set: '+self.border_icon)
            self.map_grid[row][column] = self.border_icon
        else:
            print('set: '+self.body_icon)
            self.map_grid[row][column] = self.body_icon
我认为这是可行的

    row=0
    column=0
    while(row<=self.x_size):
        while(column<=self.y_size):
            if row==0 or row==self.x_size:
                print("#",end="")
            elif column==0 or column==self.y_size:
                print("#",end="")
            else:
                print(" ",end="")
            column=column+1
        column=0
        print()
        row=row+1
行=0
列=0

当(row@NibboNSX,用户必须考虑到这一点,如果他们发现答案正确并且解决了他们的问题,请将其标记为答案。这样,如果将来有人有相同的问题,他们可以在不询问新问题的情况下获得方便的帮助。这就是这里的工作原理。欢迎使用so:)@NibboNSX,用户必须考虑到这一点,如果他们发现答案正确并且解决了他们的问题,那么请将其标记为答案。这样,如果将来有人遇到同样的问题,他们可以在不询问新问题的情况下获得方便的帮助。这就是这里的工作方式。欢迎使用so:)