Изменяемые и неизменяемые объекты в Python

Содержание
Введение
Изменяемые и неизменяемые объекты
Похожие статьи

Введение

Основной объект в Python, от которого всё наследуется это PyObject python.org

У него есть два атрибута: счётчик ссылок Py_REFCNT и тип Py_TYPE .

Про итерацию, итераторы и итерируемые объекты вы можете прочитать в статье «Итерация в Python»

Про типы данных в Python можно прочитать много интересного в официальной документации и статье «Python collections»

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

Объекты могут быть изменяемыми (mutable) и неизменяемыми (immutable)

Очень хорошей иллюстрацией разницы в их применении являются аргументы по умолчанию

Множество (set) , Словарь (dict) и Список (list) это изменяемые объекты.

Строка - это неизменяемый объект

# Пример 1. Строка a = "aaa" b = a print("a = ", a) print("b = ", b) print("id(a) == id(b):", id(a) == id(b)) # True так как a и b это один и тот же объект print("id(a): ", id(a)) b = "bbb" print("b = ", b) print("id(a) == id(b):", id(a) == id(b)) # False так как b теперь новый объект print("id(a): ", id(a)) print("id(b): ", id(b)) print("a =", a) print("b =", b)

a = aaa b = aaa id(a) == id(b): True id(a): 2037982796544 b = bbb id(a) == id(b): False id(a): 2037982796544 id(b): 2037982798368 a = aaa b = bbb

В следующем скрипте мы повторим те же действия, но уже со списками.

Список - это изменяемый объект, но в этом примере поведение списка и строки пока что одинаковое потому что и

b = "bbb"

и

m = ["m", "m"]

создают новые объекты.

# Пример 1. Список lst = ["l", "l"] m = lst print("lst: ", lst) print("m: ", m) print("id(lst) == id(m): ", id(lst) == id(m)) # True m = ["m", "m"] print("lst = ", lst) print("m = ", m) print("id(lst) == id(m): ", id(lst) == id(m)) # False

lst: ['l', 'l'] m: ['l', 'l'] id(lst) == id(m): True lst = ['l', 'l'] m = ['m', 'm'] id(lst) == id(m): False

А в следующем примере уже видна разница. Изначальная строка a останется без изменений, а вот список lst изменится из-за изменения m

# Пример 2. Строка a = "heihei" b = a print("a =", a) print("b =", b) print("id(a) == id(b): ", id(a) == id(b)) # True b += ".ru" print("a =", a) print("b =", b) print("id(a) == id(b): ", id(a) == id(b)) # False # Пример 2. Список lst = ["heihei.ru", "topbicycle.ru"] m = lst print("lst = ", lst) print("m = ", m) print("id(lst) == id(m)", id(lst) == id(m)) # True m.append("beget.com") print("lst =", lst) print("m =", m) print("id(lst) == id(m)", id(lst) == id(m)) # True здесь проявилась изменяемость списка.

a = heihei b = heihei id(a) == id(b): True a = heihei b = heihei.ru id(a) == id(b): False lst = ['heihei.ru', 'topbicycle.ru'] m = ['heihei.ru', 'topbicycle.ru'] id(lst) == id(m) True lst = ['heihei.ru', 'topbicycle.ru', 'beget.com'] m = ['heihei.ru', 'topbicycle.ru', 'beget.com'] id(lst) == id(m) True

С помощью функции id() можно убедиться в том, что строка b стала новым объектом после b += "b" а список m и список lst остались одним и тем же объектом.

В следующем примере мы изменим список не с помощью append(), а напрямую, но результат будет таким же.

# Mutable Objects print("\n# Mutable Objects:\n") my_list = [0, 1, 2] print(f"my_list = {my_list}") s = my_list print("s = my_list") print(f"s = {s}") # Изменим элемент в s # и увидим, что и изначальный my_list изменится s[1] = 34 print("s[1] = 34") print(f"s = {s}") # Изменился не только s но и my_list print(f"my_list = {my_list}") print(f"s is my_list: {s is my_list}") # Python doesn't have variables in the sense of boxes # holding a value # Python has named references to objects

python objects_example.py

# Mutable Objects: my_list = [0, 1, 2] s = my_list s = [0, 1, 2] s[1] = 34 s = [0, 34, 2] my_list = [0, 34, 2] s is my_list: True

Автор статьи: Андрей Олегович

Похожие статьи
Размер объекта
weakref
Основы Python
Встроенные типы данных
Изменяемые и неизменяемые
Итерация
os
dir()
id()

Поиск по сайту

Подпишитесь на Telegram канал @aofeed чтобы следить за выходом новых статей и обновлением старых

Перейти на канал

@aofeed

Задать вопрос в Телеграм-группе

@aofeedchat

Контакты и сотрудничество:
Рекомендую наш хостинг beget.ru
Пишите на info@urn.su если Вы:
1. Хотите написать статью для нашего сайта или перевести статью на свой родной язык.
2. Хотите разместить на сайте рекламу, подходящую по тематике.
3. Реклама на моём сайте имеет максимальный уровень цензуры. Если Вы увидели рекламный блок недопустимый для просмотра детьми школьного возраста, вызывающий шок или вводящий в заблуждение - пожалуйста свяжитесь с нами по электронной почте
4. Нашли на сайте ошибку, неточности, баг и т.д. ... .......
5. Статьи можно расшарить в соцсетях, нажав на иконку сети: