Списки в Python: изменяемость, доступ к элементам

Список представляет собой последовательность в Python. Словарное значение списка — «некоторое количество связанных элементов или имен, написанных или напечатанных последовательно».

Мы часто используем списки и в повседневной жизни (например, составление списка покупок), и в программах (например, создание списка простых чисел). Мы составляем списки всякий раз, когда хотим сгруппировать определенные элементы по определенным критериям.

Список в Python предоставляет те же функциональные возможности, позволяющие группировать элементы с возможностью произвольного доступа к каждому элементу, изменения каждого элемента, добавления или удаления элемента из него.

Итак, начнем с создания списка.

list1 = [1,2,3,4,5]
>>> list1
[1, 2, 3, 4, 5]
>>> type(list1)
<type 'list'>

type() — это функция в Python, которая возвращает тип объекта переменной.

Создать список в Python очень просто. Вы можете сделать это двумя способами. Первый: заключить в квадратные скобки элементы, которые мы видели в приведенном выше примере. Другой — использовать функцию list().

>>> list1 = list([1,2,3,4,5])
>>> list1
[1, 2, 3, 4, 5]
>>> type(list1)
<type 'list'>

У списков есть интересная особенность: они хранят ссылки на объекты или элементы в нем. Таким образом, при переназначении списка на другую переменную Python изменяет только ссылку, а не создает новый объект списка.

# id() function returns the object id.
>>> id(list1)
4426491160
>>> list2 = list1
>>> id(list2)
4426491160

Мы видим, что обе переменные ссылаются на один и тот же объект. Это очень сильно ускоряет выполнение программы. Список — это глобальная переменная, то есть, когда вы объявляете список и передаете его функции в качестве аргумента, а не копируете и передаете функции, Python передает ссылку на список.

Доступ к элементам

Python назначает индекс каждому из элементов списка, нумерация идет с нуля. Итак, если вы хотите получить доступ к определенному элементу в списке, вы можете обратиться к нему по его индексу. Для этого вы должны знать индекс элемента. Впрочем, даже если вы этого не знаете, не беспокойтесь, для этого есть одно решение. Но пока давайте попробуем получить доступ к элементам по их индексу.

>>> list1
[1, 2, 3, 4, 5]
>>> print(list1[0])
1
>>> print(list1[2])
3
>>> print(list1[1])
2

Python выбросит IndexError, если вы передадите индекс, который не связан со списком, или если этот индекс не ссылается на объект.

>>> list1
[1, 2, 3, 4, 5]
>>> print(list1[9])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
>>>

Бывают ситуации, когда вы знаете, к какому элементу вы хотите получить доступ, но не знаете его индекс. В таких ситуациях вы можете найти этот элемент в соответствующем списке, а функция поиска (функция index() в случае списков) возвращает индекс этого элемента.

>>> list1
[1, 2, 3, 4, 5]
>>> list1.index(2)
1 // index of 2

Поведение списков при изменении

Список как тип данных относится к категории изменяемых структур данных. Слово «изменяемый» означает, что вы можете вносить любые изменения в структуру данных даже после ее определения. Итак, какие изменения вы можете произвести по отношению к списку? Вы можете обновить, добавить новый и удалить любой элемент.

Позвольте продемонстрировать.

Изменение элементов списка

>>> list1
[1, 2, 3, 4, 5]
>>> list1[0] = 2
>>> list1
[2, 2, 3, 4, 5]

Удаление элементов списка

>>> list1
[2, 2, 3, 4, 5]
>>> list1.remove(5) #remove element 5
>>> list1
[2, 2, 3, 4]

Обновлять и удалять элементы легко и просто. Что касается добавления элемента в список, существует много разных способов сделать это. Все зависит от того, куда и как вы хотите добавить элемент. Одним из этих способов является использование функции insert().

Вставка элемента

list.insert(index, value) принимает 2 аргумента. Первый — это индекс, по которому вы хотите добавить элемент, а второй — сам элемент или его значение.

>>> list1
[2, 2, 3, 4]
>>> list1.insert(4,89)
>>> list1
[2, 2, 3, 4, 89] #inserting 89 at 4th index.

Что будет, если вы передадите индекс, который намного больше, чем размер списка? Ну, в этом случае список добавит элемент в конец.

>>> list1
[2, 2, 3, 4, 89]
>>> list1.insert(100000,100)
>>> list1
[2, 2, 3, 4, 89, 100]

Помимо вставки, вы можете использовать append(), чтобы добавить элемент в конец списка.

>>> list1 = [2, 2, 3, 4, 89, 100]
>>> list1.append(67)
>>> list1
[2, 2, 3, 4, 89, 100, 67]

Итак, мы рассмотрели базовые операции CRUD (Create Read Update Delete) со списком. В списке слишком много встроенных функций. Мы не собираемся охватывать все это. Но если вы хотите узнать больше, то можете перейти по ссылке на документацию Python.

https://docs.python.org/3/tutorial/datastructures.html

Списки из неизменяемых объектов

Можем ли мы сделать список кортежей? Tuple является неизменяемым объектом, а список — изменяемым. Итак, если мы объявим список кортежей, станут ли они изменяемыми? Давайте проверим это.

>>> list1.insert(6,("element1","element2"))
>>> list1
[2, 2, 3, 4, 89, 100, ('element1', 'element2')]
>>> type(list1)
<type 'list'>
>>> type(list1[6])
<type 'tuple'>
>>> list1[6][0]=3
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment

Таким образом, даже если неизменяемый объект хранится в списке, Python не изменяет его свойства.

Список может иметь любой тип данных в качестве элемента, будь то словарь, кортеж, строка или другой список. Это одна из причин, почему список так часто используется программистами.

О списках следует знать куда больше, чем описано в этой статье. Со многими особенностями и свойствами вы познакомитесь, когда начнете работать со списками. Но чтобы научиться продвинутому использованию, всегда необходимо фундаментальное понимание. В этой статье мы рассмотрели самые основы. Если вы поняли эти операции, вы готовы к дальнейшему изучению и базовому использованию списков.

Итак, базовое понимание есть — можно двигаться дальше уже самостоятельно. Для закрепления мы бы рекомендовали самостоятельно поиграться со списками в консоли, попробовать их в сочетании с другими типами данных, циклами, функциями. А мы желаем вам удачи в дальнейшем изучении языка Python.