Прочитав это сообщение в блоге, вы узнаете:
- Каковы идентичность, тип и значение объекта?
- Что такое изменяемые и неизменяемые объекты
Введение (объекты, значения и типы)
Все данные в коде Python представлены объектами или отношениями между объектами. У каждого объекта есть идентификатор, тип и значение.
Личность
идентификатор никогда не меняется после создания; вы можете думать об этом как о адресе объекта в памяти. Оператор
is
сравнивает идентичность двух объектов; функцияid()
возвращает целое число, представляющее его идентичность.
Тип
Тип объекта определяет возможные значения и операции (например, «есть ли у него длина?»), Которые поддерживает этот тип. type()
функция возвращает тип объекта. Тип объекта неизменяемый, как и личность.
Ценить
значение некоторых объектов может изменяться. Объекты, значение которых может изменяться, считаются изменяемыми; объекты, значение которых не изменяется после их создания, называются неизменяемыми.
Изменчивость объекта определяется его типом.
Важное примечание
Некоторые объекты содержат ссылки на другие объекты, эти объекты называются контейнерами. Некоторые примеры контейнеров: кортеж, список и словарь. значение неизменяемого контейнера, содержащего ссылку на изменяемый объект , может быть изменено, если этот изменяемый объект изменен. Однако контейнер по-прежнему считается неизменным, потому что, когда мы говорим о изменчивости контейнера, подразумеваются только идентификаторы содержащихся в нем объектов.
В следующем разделе мы увидим дополнительную информацию и подробные примеры, чтобы лучше понять различия между изменяемыми и неизменяемыми объектами.
Изменяемые и неизменяемые типы данных в Python
- Некоторые из изменяемых типов данных в Python - это список, словарь, набор и определяемые пользователем классы.
- С другой стороны, некоторые из неизменяемых типов данных - это int, float, decimal, bool, string, tuple и range.
Пришло время привести несколько примеров. Начнем со сравнения типов данных кортеж (неизменяемый) и список (изменяемый). Мы можем определить список, используя квадратные скобки []
, например: numbers = [1, 2, 3]
. Чтобы определить кортеж, нам просто нужно заменить квадратные скобки на круглые скобки ()
, например: numbers = (1, 2, 3)
. Из обоих типов данных мы можем получить доступ к элементам по индексу и можем перебирать их. Основное отличие состоит в том, что кортеж нельзя изменить после его определения.
Списки индексации и кортежи
Выход:
1 10
Изменение значений: списки против кортежей
Выход:
[100, 2, 3] -------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-2-286c46a29f5d> in <module>() 3 list_values[0] = 100 4 print(list_values) ----> 5 set_values[0] = 100 TypeError: 'tuple' object does not support item assignment
Мы видим, что когда мы пытаемся изменить кортеж, мы получаем ошибку, но у нас нет этой проблемы со списком.
Кортеж против расширения списка
Теперь мы можем попытаться расширить наш список и кортеж с помощью оператора +=
. Это будет работать для обоих типов данных. Посмотрим, что будет.
Выход:
2450343168136 2450343205552 2450343168136 2450341742248
Мы видим, что идентификатор списка не изменился, а идентификатор кортежа изменился. Это означает, что мы расширили наш список, но создали полностью новый кортеж. Списки более эффективны с точки зрения памяти, чем кортежи.
Другие примеры неизменяемых типов данных
Мы видели, что некоторые из других неизменяемых типов данных являются целыми числами и строками. После инициализации их значения нельзя изменить.
Выход:
1657696608 1657696640
Выход:
2450343168944 2450343426208
Мы видим, что как для числовых, так и для текстовых переменных их идентичность изменилась. Это означает, что в обоих случаях создаются новые переменные.
Копирование изменяемых объектов по ссылке
Давайте посмотрим, что произойдет, если мы дадим два имени одного и того же объекта изменяемым типам данных.
Выход:
2450343166664 2450343166664 True [4, 5, 6, 7] [4, 5, 6, 7]
Мы видим, что имена переменных имеют одинаковые идентификаторы, что означает, что они ссылаются на один и тот же объект в памяти компьютера. Напоминание: оператор is
сравнивает идентичность двух объектов.
Итак, когда мы изменили значения второй переменной, значения первой также изменятся. Это происходит только с изменяемыми объектами. Вы можете увидеть, как можно этого избежать, в одной из моих предыдущих публикаций в блоге.
Копирование неизменяемых объектов
Давайте попробуем сделать аналогичный пример с неизменяемым объектом. Мы можем попробовать скопировать две строки и изменить значение в любой из них.
Выход:
3063511450488 3063511450488 True 3063551623648 3063511450488 False Python is awesome Python
Каждый раз, когда мы пытаемся обновить значение неизменяемого объекта, вместо этого создается новый объект. Вот когда мы обновили первую строку, значение второй не изменилось.
Оператор ==
Иногда мы хотим не сравнивать идентичность двух объектов, а сравнивать значения этих объектов. Мы можем сделать это с помощью оператора ==
.
Выход:
True False
Мы можем ясно видеть, что два объекта имеют одинаковые значения, но их идентичности различны.
Неизменяемый объект, меняющий свое значение
Как мы уже говорили ранее, значение неизменяемого контейнера, содержащего ссылку на изменяемый объект, может быть изменено, если этот изменяемый объект изменен. Давайте посмотрим на пример.
Выход:
<class 'tuple'> (129392130, ['Programming', 'Machine Learning', 'Statistics']) (129392130, ['Programming', 'Machine Learning', 'Maths'])
Мы изменили значение переменной skills
. Другая переменная person
содержит ссылку на переменную skills
, поэтому ее значение также обновляется.
Напоминание
Объект по-прежнему считается неизменным, потому что, когда мы говорим о изменчивости контейнера, только идентификаторы содержащихся в нем объектов подразумевается.
Однако, если ваш неизменяемый объект содержит только неизменяемые объекты, мы не можем изменить их значение. Давайте посмотрим на пример.
Выход:
1657696608 1657696032 (42, 24, ('Python', 'pandas', 'scikit-learn')) 1657696864 1657696064 (42, 24, ('Python', 'pandas', 'scikit-learn'))
Помните, что когда вы пытаетесь обновить значение неизменяемого объекта, вместо него создается новый объект.
Резюме
- Все данные в коде Python представлены объектами или отношениями между объектами.
- У каждого объекта есть идентификатор, тип и значение.
- Идентификационные данные объекта никогда не меняются после создания. Вы можете думать об этом как о адресе объекта в памяти.
- Тип объекта определяет возможные значения и операции.
- Объекты , значение которых может изменяться, называются изменяемыми. Объекты, чье значение остается неизменным после их создания, называются неизменяемый.
- Когда мы говорим о изменчивости контейнера, подразумеваются только идентичности содержащихся в нем объектов.
Ресурсы
- Https://www.pythonforthelab.com/blog/mutable-and-immutable-objects/
- Https://standupdev.com/wiki/doku.php?id=python_tuples_are_immutable_but_may_change
- Https://www.geeksforgeeks.org/mutable-vs-immutable-objects-in-python/
- Https://docs.python.org/3/reference/datamodel.html
- Https://docs.python.org/3/library/functions.html#id
Другие сообщения в блоге, написанные мной
Вы также можете проверить мои предыдущие сообщения в блоге.
- Ярлыки Jupyter Notebook
- Основы Python для науки о данных
- Основы Python: итерация, итераторы, итераторы и циклы
- Основы Python: понимание списков
- Наука о данных с Python: Введение в визуализацию данных с Matplotlib
- Наука о данных с Python: Введение в загрузку, подмножество и фильтрацию данных с помощью pandas
- Введение в обработку текста на естественном языке
Новостная рассылка
Если вы хотите получать уведомления, когда я публикую новый пост в блоге, вы можете подписаться на мой информационный бюллетень.
Вот мой профиль в LinkedIn на случай, если вы захотите связаться со мной. Я буду счастлив быть на связи с вами.
Заключительные слова
Спасибо за то, что прочитали. Надеюсь, статья вам понравилась. Если вам это нравится, пожалуйста, удерживайте кнопку хлопка и поделитесь ею с друзьями. Буду рад услышать ваш отзыв. Если у вас есть вопросы, не стесняйтесь их задавать. 😉