Изменяемые и неизменяемые объекты в 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() |