Глава 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]
ab[1, 2, 3, 4]
a и b — это ДВА ИМЕНИ одного и того же объекта-списка, а не два списка
Мы не создали второй список — мы создали второе имя
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]
a и b — два разных объекта с одинаковым содержимым: a == b, но не a is b
ОператорЧто проверяет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, без установки
Открыть практику →