Python在具有可变长度的对象构造函数中创建2D数组

Python在具有可变长度的对象构造函数中创建2D数组,python,arrays,constructor,Python,Arrays,Constructor,我在创建对象时遇到问题,2D数组的长度可变。我总是出错 self.state[i] = listt[i] IndexError: list assignment index out of range 如果我尝试用2行3列的数组创建对象,它会工作。如果我尝试创建一个包含3行3列的对象,它将失败并出现错误 class node: def __init__(self, m, n, listt=None): self.not_in_place = -1 self

我在创建对象时遇到问题,2D数组的长度可变。我总是出错

self.state[i] = listt[i]
IndexError: list assignment index out of range
如果我尝试用2行3列的数组创建对象,它会工作。如果我尝试创建一个包含3行3列的对象,它将失败并出现错误

class node:
    def __init__(self, m, n, listt=None):
        self.not_in_place = -1
        self.m = m
        self.n = n
        self.state = [[m],[n]]
        if listt is not None:
            for i in range(self.m):
              self.state[i] = listt[i] 

start = [[0,1,2],[3,4,5],[6,7,8]] 
node(3, 3, start) # doesn't work


start_2 = [[0,1,2],[3,4,5]] 
node(2, 3, start_2) # work

我做错了什么

在python中,不能仅通过给定大小来初始化给定大小的数组,也不需要这样做

要将给定列表指定给
状态
,请执行以下操作复制该列表

if listt is not None:
    self.state = list(listt)

它在第二种情况下起作用的原因是,您创建了一个包含2个子列表的列表,因此创建了2个框,当您对它们进行迭代时,这是正常的,这也是为什么尝试长度为3时失败的原因

state = [[2], [3]]  # [[2], [3]], and not [[,,], [,,]]
如果要初始化为空,如果
listt
为None,则可以执行以下操作

class node:
    def __init__(self, m, n, listt=None):
        self.not_in_place = -1
        self.m = m
        self.n = n
        self.state = [[]] * m
        if listt is not None:
            self.state = list(listt)

    def __str__(self):
        return str(self.state)

if __name__ == '__main__':
    start = [[0, 1, 2], [3, 4, 5], [6, 7, 8]]
    n = node(3, 3, start)
    print(n)  # [[0, 1, 2], [3, 4, 5], [6, 7, 8]]

    n = node(2, 3, None)
    print(n)  # [[], []]

非常感谢!现在我有另一个问题。如何获取数组中例如0的数字的位置/索引[x][y]?我需要它的位置,这样我就可以处理数组。@TomášRončák读取
[0,1,2]
do
state[0]
,读取
0
do
state[0][0]