Посмотрите на этот код: x = 10 def show(): x = 20 print(x) show() print(x) Что он выведет? 20 10 Но постойте. Как такое вообще возможно? В программе есть переменная x. Сначала мы присвоили ей 10, а потом внутри функции присвоили ей 20. Если x - это имя, связанное с объектом, почему после вызова функции оно снова указывает на 10? Неужели Python каким-то образом вернул старое значение? Нет. Никакого возврата не произошло. На самом деле в этой программе существуют два разных имени x. В предыдущей статье мы познакомились с пространствами имён. Имя не существует само по себе. Оно находится внутри некоторого пространства имён и связывается там с объектом...
Python без магии
Где Python хранит имена?
За последние несколько статей мы много раз говорили одну и ту же фразу. Имя начинает ссылаться на объект. Например: x = 10 или numbers = [1, 2, 3] Мы уже знаем, что переменная не является “ячейкой памяти”, внутри которой лежит значение. Создаётся объект. А имя начинает ссылаться на него. Но теперь возникает новый вопрос. Где вообще хранится само имя? Попробуйте выполнить такой код. name = "Python" print(name) Почему Python вообще знает, что такое name? Ведь мы нигде не говорили: “Сохрани эту переменную вот здесь...
Зачем Python нужен Garbage Collector?
В предыдущей статье мы познакомились с подсчётом ссылок. Идея оказалась удивительно простой. Пока на объект существует хотя бы одна ссылка, объект продолжает жить. Когда последняя ссылка исчезает, Python понимает, что объект больше никому не нужен, и освобождает память. Кажется, что этого механизма вполне достаточно. Но давайте рассмотрим небольшой пример. a = [] b = [] a.append(b) b.append(a) На первый взгляд здесь нет ничего необычного. Мы создали два списка. Но теперь каждый из них хранит ссылку на другой...
Когда объект действительно удаляется?
В предыдущей статье мы выяснили, что оператор del удаляет не объект, а только имя. Но тогда возникает вполне закономерный вопрос. Если объект продолжает существовать после удаления имени, то кто вообще решает, когда его можно удалить из памяти? Попробуем разобраться. Представим самый простой пример. numbers = [1, 2, 3] После выполнения этой строки существует один объект списка. На него ссылается одно имя. Схематично это выглядит так: numbers ───► [1, 2, 3] Теперь появляется ещё одно имя. other = numbers Получаем: Два имени...
Что делает оператор `del`?
Попробуйте угадать, что выведет этот код. numbers = [1, 2, 3] other = numbers del numbers print(other) Многие ожидают, что программа завершится с ошибкой. Ведь мы только что удалили список. Однако Python спокойно выводит: [1, 2, 3] Получается странная ситуация. Мы удалили список. Но он почему-то продолжает существовать. Почему? Чтобы ответить на этот вопрос, давайте вспомним одну из первых статей этой серии. Когда мы пишем: numbers = [1, 2, 3] переменная не хранит список внутри себя. Создаётся объект списка...
