Копия или ссылка: важное про переменные
«Я поменял один список, а изменился и второй» — классическая загадка. Дело в ссылках.
Переменная — это ярлык
В Python переменная не «коробка со значением», а ярлык (ссылка) на объект в памяти. Когда вы пишете b = a для списка, вы не копируете список — вы вешаете второй ярлык на тот же самый объект.
Почему меняются оба
Раз a и b указывают на один список, изменение через b видно и через a — это один и тот же объект. Для изменяемых типов (списки, словари, множества) это частый источник неожиданных багов.
Как сделать настоящую копию
Чтобы получить независимую копию списка, используйте срез a[:], метод a.copy() или list(a). Для вложенных структур нужна «глубокая» копия — copy.deepcopy, иначе внутренние списки останутся общими.
А что с числами и строками
Числа, строки и кортежи неизменяемы: их нельзя поменять «на месте», поэтому проблема с общей ссылкой для них не возникает. Понимание изменяемости приходит с практикой — тренируйтесь на маленьких примерах.
Частые вопросы
Как проверить, один ли это объект? Оператором is или функцией id().
Когда нужна глубокая копия? Когда в списке лежат другие списки или словари, и их тоже нужно скопировать независимо.
Начать игру бесплатно