Глава 11 · Очень много информации!
Ссылки, aliasing, == и is
Два имени могут указывать на один и тот же список — и это не баг, а фундаментальная особенность того, как Python работает с изменяемыми объектами.
Aliasing: два имени — один и тот же объект
В §11.7 мы уже видели предупреждение: b = a не создаёт копию
списка. Разберём подробно, что происходит на самом деле.
aliasing.py
a = [1, 2, 3]
b = a
b.append(4)
print(a) # [1, 2, 3, 4] — тоже изменился!
print(b) # [1, 2, 3, 4]
Мы не создали второй список — мы создали второе имя
b = a не копирует данные. Python просто говорит: «теперь имя b указывает туда же, куда и a». Формальный термин для этого — aliasing (совместная ссылка). Изменение через любое из двух имён видно через оба, потому что список-объект на самом деле один.== сравнивает содержимое, is — сравнивает объект
Отличная возможность закрепить материал главы 9 на новом материале:
eq_vs_is.py
a = [1, 2, 3]
b = [1, 2, 3]
print(a == b) # True — содержимое одинаковое
print(a is b) # False — это два РАЗНЫХ объекта
c = a
print(a is c) # True — c это то же самое имя-alias для a
| Оператор | Что проверяет | a = [1,2,3]; b = [1,2,3] |
|---|---|---|
== | одинаковое ли содержимое | True |
is | один ли и тот же объект в памяти | False |
★★ Самостоятельная задача
Предсказать результат
Дано: x = [10, 20], y = x, y.append(30). Не запуская код, ответьте: чему равен x? А если бы вместо y = x было y = x.copy()?
Практика: aliasing, == и is
Интерактивный ноутбук прямо в браузере — Python 3.14 через Pyodide, без установки