Python [im] + [изменяемые] данные

В языке Python понимание того, что «все является объектом» и того, как работает «тип» объекта, является одним из ключей к тому, чтобы стать хорошим программистом на Python. Каждый объект имеет тип (список, строка, кортеж и т. д.), также называемый классом. каждый тип попадает в одну из двух категорий: изменчивые и неизменяемые или, другими словами, значения переменных, которые остаются заблокированными и не могут быть изменены, и значения переменных, которые разблокированы и которыми можно манипулировать. Типы также могут быть вложены друг в друга, и это может довольно быстро усложниться.

Давайте рассмотрим некоторые основы понимания типов и того, как они работают. Во-первых, есть встроенные функции, позволяющие возвращать некоторую ключевую информацию. Использование функции id() вернет уникальный адрес памяти данного объекта. Встроенная функция type() вернет… тип!

>>> a = 924
>>> type(a)
<class 'int'>
>>> id(a)
234652

Теперь давайте проверим различные типы данных и посмотрим, к какой категории они относятся. (Таблица типов данных 1.0)

Так что же на самом деле означает неизменяемый? Если вы похожи на меня, вам понадобятся визуальные эффекты.

>>> a = (8, 1, 5)
>>> type(a)
<class 'tuple'>
>>> id(a)
234652000
#lets try and change 'a' which is immutable
>>> a[2] = 9
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment

Что случилось? Мы попытались изменить переменную «a», которая содержит тип значения кортежа. Кортеж нельзя изменить, поэтому возникло сообщение об ошибке типа. Это удобно при работе с функциями. Неизменный очень последователен из-за своих ограничений. Вы знаете, что, передавая неизменяемый тип в функцию, вы получите данные обратно в том же состоянии, в котором вы их отправили.

Давайте теперь посмотрим на тип, который мы можем мутировать или изменить… список!

>>> a = [8, 1, 5]
>>> type(a)
<class 'list'>
>>> id(a)
234652000518
>>> b = a
>>> type(b)
<class 'list'>
>>> id(b)
234652000518
>>>b is a
True
>>> a[2] = 815
>>> print(a)
[8, 1, 815]
>>>print(b)
[8, 1, 815]

Как видите, переменная «а» могла измениться. Мы создали переменную «b» до изменения переменной a, поэтому мы знаем, что реальная переменная была изменена, а не ее копия; что технически происходит в фоновом режиме без вашего ведома. Так же, как если бы вы сложили два списка вместе. Компьютер автоматически создаст новый список в фоновом режиме и предоставит вам, программисту, новый список.

>>> a = [1, 2, 3]
>>>id(a)
139808250112408
>>> b = [4, 5, 6]
>>> id(b)
139808250054920
>>> a = a + b
>>> print(a)
[1, 2, 3, 4, 5, 6]
>>> id(a)
139808250127712

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

>>> a = [1, 2]
>>> b = (1, a)
>>> print(b)
(1, [1, 2])
>>> a[1] = 0
>>> print b
(1, [1, 0])
>>> id(a)
139808250054920
>>> id(b)
139808311058232
>>> type(a)
<type 'list'>
>>> type(b)
<type 'tuple'>

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

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