• Предмет: Информатика
  • Автор: dodnfjdj
  • Вопрос задан 5 месяцев назад

Расскажите о преимуществах работы со списками python. Как
определяются вложенные списки в массивах? Как осущест-
вляется доступ к элементам двумерного массива?

Ответы

Ответ дал: msmolenska19
0
Создание вложенных списков
Пусть даны два числа: количество строк n и количество столбцов m. Необходимо создать список размером n×m, заполненный нулями.

Очевидное решение оказывается неверным:


1
2
a = [[0] * m] * n
В этом легко убедиться, если присвоить элементу a[0][0] значение 5, а потом вывести значение другого элемента a[1][0] — оно тоже будет равно 5. Дело в том, что [0] * m возвращает ccылку на список из m нулей. Но последующее повторение этого элемента создает список из n элементов, которые являются ссылкой на один и тот же список (точно так же, как выполнение операции b = a для списков не создает новый список), поэтому все строки результирующего списка на самом деле являются одной и той же строкой.

В визуализаторе обратите внимание на номер id у списков. Если у двух списков id совпадает, то это на самом деле один и тот же список в памяти.

запустить выполнить пошагово

1
2
3
4
5
6
n = 3
m = 4
a = [[0] * m] * n
a[0][0] = 5
print(a[1][0])
Таким образом, двумерный список нельзя создавать при помощи операции повторения одной строки. Что же делать?

Первый способ: сначала создадим список из n элементов (для начала просто из n нулей). Затем сделаем каждый элемент списка ссылкой на другой одномерный список из m элементов:

запустить выполнить пошагово

1
2
3
4
5
6
n = 3
m = 4
a = [0] * n
for i in range(n):
a[i] = [0] * m
Другой (но похожий) способ: создать пустой список, потом n раз добавить в него новый элемент, являющийся списком-строкой:

запустить выполнить пошагово

1
2
3
4
5
6
n = 3
m = 4
a = []
for i in range(n):
a.append([0] * m)
Но еще проще воспользоваться генератором: создать список из n элементов, каждый из которых будет списком, состоящих из m нулей:

запустить выполнить пошагово

1
2
3
4
n = 3
m = 4
a = [[0] * m for i in range(n)]
В этом случае каждый элемент создается независимо от остальных (заново конструируется список [0] * m для заполнения очередного элемента списка), а не копируются ссылки на один и тот же список.

Вас заинтересует