IndexError: list assignment index out of range
Вот задача: Даны два числа n и m. Создайте двумерный массив A[n][m], заполните его таблицей умножения A[i][j]=i*j и выведите на экран.
Вот мой код:
def printer(mass):
for i in range(len(mass)):
print(mass[i])
n, m = map(int, input().split())
mass = [[0] for i in range(n)]
for i in range(n):
for j in range(m):
mass[i][j] = i * j
printer(mass)
Когда запускаю вылезает ошибка:
Traceback (most recent call last): File "/home/admin1/PycharmProjects/2/homeworks/E (Состязания - 3).py", line 10, in mass[i][j] = i * j IndexError: list assignment index out of range
Никак не могу понять что не так...
Ответы (1 шт):
Вы инициализируете только 1 элемент массива массивов. Приведу пример. Пусть n = 3:
[[0], [0], [0]]
Для того, чтобы поправить эту проблему, Вам нужно сделать следующее:
mass = [[0] * m for i in range(n)]
Тогда, если, например, m = 2, Вы получите:
[[0, 0], [0, 0], [0, 0]]
Весь код:
def printer(mass):
for i in range(len(mass)):
print(mass[i])
n, m = map(int, input().split())
mass = [[0] * m for i in range(n)]
for i in range(n):
for j in range(m):
mass[i][j] = i * j
printer(mass)
Для того, чтобы обнаруживать такие ошибки, Вы можете использовать дебаггер. Он по умолчанию встроен во все IDE. Например, в pyCharm. Вы всегда можете выполнить построчно Ваш код и посмотреть, чему равна переменная на каждой строке. В качестве примере, можете посмотреть, как устроен дебаггер на обучающем сайте.
Если по какой-то причине, дебаггер недоступен, то Вы можете использовать print(). Но это менее удобно, поскольку в ряде конструкций (например, в лямбдах или скоращённой записи цикла) его использовать не получится.
Касательно кода. Будьте внимательны при испольщовании подобных конструкций:
[0] * 5
Они не производят копирование объектов. Например, попробуй выполнить следующее:
x = [[1]] * 5
x[0][0] = 1
print(x)
И посмотрите за результатом.