Прочитав это сообщение в блоге, вы узнаете:

  • Каковы идентичность, тип и значение объекта?
  • Что такое изменяемые и неизменяемые объекты

Введение (объекты, значения и типы)

Все данные в коде 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 представлены объектами или отношениями между объектами.
  • У каждого объекта есть идентификатор, тип и значение.
  • Идентификационные данные объекта никогда не меняются после создания. Вы можете думать об этом как о адресе объекта в памяти.
  • Тип объекта определяет возможные значения и операции.
  • Объекты , значение которых может изменяться, называются изменяемыми. Объекты, чье значение остается неизменным после их создания, называются неизменяемый.
  • Когда мы говорим о изменчивости контейнера, подразумеваются только идентичности содержащихся в нем объектов.

Ресурсы

Другие сообщения в блоге, написанные мной

Вы также можете проверить мои предыдущие сообщения в блоге.

Новостная рассылка

Если вы хотите получать уведомления, когда я публикую новый пост в блоге, вы можете подписаться на мой информационный бюллетень.

LinkedIn

Вот мой профиль в LinkedIn на случай, если вы захотите связаться со мной. Я буду счастлив быть на связи с вами.

Заключительные слова

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