Python создание 2D массива в конструкторе объектов с переменной длиной - PullRequest
0 голосов
/ 21 марта 2020

У меня проблема с созданием объектов, где 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

Что я делаю не так?

1 Ответ

1 голос
/ 21 марта 2020

В python вы не можете инициализировать массив с заданным размером, просто указав размер, а также вам не нужно

Чтобы назначить данный список для state, скопируйте это делается с помощью

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

Причина, по которой это сработало во втором случае, заключается в том, что вы создали список с 2 подсписками, поэтому создаются 2 поля, и это нормально, когда вы выполняете их итерацию, а также почему произошел сбой при попытке длины 3

state = [[2], [3]]  # [[2], [3]], and not [[,,], [,,]]

Если вы хотите инициализировать пустой, в случае, если listt - Нет, вы можете сделать

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)  # [[], []]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...