Понимание изменяемых и неизменяемых объектов в Python на примере.

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

неизменный объект (неизменяемый объект) - это объект, состояние которого не может быть изменено после его создания. В этом отличие от изменяемого объекта (изменяемого объекта), который может быть изменен после его создания - Из Википедии .

Таким образом, мы можем изменять изменяемые объекты, но не можем изменять неизменяемые объекты. Но что это на самом деле означает? В этой статье мы подробно рассмотрим эту тему.

Неизменяемые объекты

String, tuple, int, float, boool, unicode - неизменяемые объекты в Python. Возьмем для примера строку и посмотрим, что на самом деле означает неизменяемый объект.

>>> s = ‘apple’
>>> print(s)
apple

Итак, у нас есть простая строка s. Теперь давайте посмотрим на код ниже.

>>> s = ‘apple’
>>> print(s)
apple
>>> s = ‘mango’
>>> print(s)
mango

Мы знаем, что не можем изменить неизменяемый объект. Но здесь строка s изменена. Ну s не изменил своего состояния. Мы присвоили s как новую строку. Мы можем очистить это с помощью id(). Python имеет встроенную функцию id(), которая показывает нам расположение объекта в памяти в виде целочисленного значения. См. Код ниже.

>>> s = ‘apple’
>>> print(f’The memory location of s is {id(s)}’)
The memory location of s is 140276163566384
>>> s = ‘mango’
>>> print(f’The memory location of s is {id(s)}’)
The memory location of s is 140276163566320

Мы видим, что у них разные места в памяти. Это означает, что мы не меняли строку, мы просто присвоили новую строку переменной s.

Если мы хотим изменить один символ строки, мы не можем этого сделать.

>>> lst = [1, 2, 3, 4, 5]
>>> s = ‘apple’
>>> s[0] = ‘s’
Traceback (most recent call last):
 File “<stdin>”, line 1, in <module>
TypeError: ‘str’ object does not support item assignment

Получили ошибку - TypeError: ‘str’ object does not support item assignment. Это потому, что s - неизменяемый объект.

Мутабельные объекты

Список, словарь, набор - это изменяемые объекты в Python. Давайте возьмем список и посмотрим, что это значит.

>>> lst = [1, 2, 3, 4, 5]
>>> print(f’The memory location of lst is {id(lst)}’)
The memory location of lst is 140474471844672
>>> lst[0] = 100
>>> print(f’The memory location of lst is {id(lst)}’)
The memory location of lst is 140474471844672

Как мы видим, мы изменили первый элемент списка lst, но место в памяти для lst осталось прежним. Так что тот же список был изменен. Это означает, что список является изменяемым объектом.

Вставка нового значения с использованием append() также сохранит список в том же месте памяти.

>>> lst.append(13)
>>> print(lst)
[100, 2, 3, 4, 5, 13]
>>> print(f’The memory location of lst is {id(lst)}’)
The memory location of lst is 140474471844672

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

>>> a = b = [1, 2, 3]
>>> id(a) == id(b)
True

a и b находятся в одном месте в памяти. Изменение элемента одной переменной изменит и другую. Потому что на самом деле это один и тот же список.

>>> a[0] = 100
>>> print(a)
[100, 2, 3]
>>> print(b)
[100, 2, 3]

Словари изменчивы, но их ключи неизменны

Мы знаем, что словари, подобные спискам, также являются изменяемыми объектами. Но ключевые элементы словаря должны быть неизменными. Мы не можем назначить изменяемый объект ключом словаря. Давайте посмотрим на пример ниже.

>>> d = { ‘name’: ‘John’, ‘age’: 34 }
>>> d[‘name’]
‘John’

Это хорошо. Потому что значения ключей - это строки, и они являются неизменяемыми объектами.

Но это даст нам ошибку -

>>> d = { [1]: ‘John’, [2]: 34 }
Traceback (most recent call last):
 File “<stdin>”, line 1, in <module>
TypeError: unhashable type: ‘list'

Но словарь - это изменяемый объект, и мы можем изменять значения словаря.

>>> d = { ‘name’: ‘John’, ‘age’: 34 }
>>> print(f’The memory location of d is {id(d)}’)
The memory location of d is 139796473768256
>>> d[‘name’] = ‘Don’
>>> print(d)
{‘name’: ‘Don’, ‘age’: 34}
>>> print(f’The memory location of d is {id(d)}’)
The memory location of d is 139796473768256

После изменения одного значения словаря d расположение памяти остается прежним. Потому что d - изменяемый объект.

Заключение

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

дальнейшее чтение









Больше контента на plainenglish.io