Найти в Дзене
Python изнутри

Python изнутри

Цель: понять модель исполнения Python.
подборка · 7 материалов
2 недели назад
Почему `+=` иногда создаёт новый объект, а иногда нет?
Попробуйте угадать, что выведет этот код. x = 10 print(id(x)) x += 5 print(id(x)) Многие ожидают, что += просто изменит значение переменной. Но если посмотреть на id(), окажется, что после выполнения операции объект стал другим. Получается, что оператор += создал новый объект. Теперь посмотрим почти такой же пример. numbers = [1, 2] print(id(numbers)) numbers += [3] print(id(numbers)) На этот раз id() остаётся прежним. Получается совершенно противоположное поведение. В одном случае объект изменился. В другом — нет. Почему? Если вспомнить предыдущие статьи, то ответ уже почти лежит на поверхности...
2 недели назад
Почему нельзя писать `def func(items=[])`
Дисклеймер: Предполагается, что вы уже умеете писать простые программы на Python и знаете базовый синтаксис (if, for, функции, списки). Здесь мы разбираем не как пользоваться языком, а почему он работает именно так. Попробуйте угадать, что выведет этот код: def add(item, items=[]): items.append(item) return items print(add(1)) print(add(2)) print(add(3)) Если вы ещё не сталкивались с этой особенностью Python, скорее всего, ожидание будет таким: [1] [2] [3] Ведь каждый вызов функции кажется совершенно независимым от предыдущего. Однако Python выводит совсем другой результат: [1] [1, 2] [1, 2, 3] Получается, что список каким-то образом “запомнил” предыдущие вызовы функции...
3 недели назад
Чем отличаются is и == ?
Если спросить начинающего Python-разработчика, чем отличаются операторы is и ==, то чаще всего можно услышать что-то вроде: Это распространённый ответ. И хотя в нём есть доля правды, он не совсем точный. Давайте разберёмся, что происходит на самом деле. Начнём с простого примера. a = [1, 2, 3] b = [1, 2, 3] print(a == b) print(a is b) Результат будет таким: True False На первый взгляд это выглядит странно. Если списки одинаковые, почему один оператор говорит True, а другой - False? Чтобы ответить на этот вопрос, давайте вспомним то, что мы уже знаем из предыдущих статей. Каждая переменная в Python содержит не объект, а имя, которое на него ссылается...
3 недели назад
Что такое изменяемые и неизменяемые объекты?
В предыдущей статье мы столкнулись с довольно любопытным наблюдением. Списки можно изменять: numbers = [1, 2] numbers.append(3) print(numbers) Результат: [1, 2, 3] А вот с числами похожий трюк не работает. Когда мы пишем: x = 10 x = 20 объект со значением 10 не превращается в объект со значением 20. Вместо этого имя x начинает ссылаться на другой объект. На первый взгляд это выглядит как два совершенно разных поведения. На самом деле Python делит все объекты на две большие группы. Первая группа называется изменяемыми объектами (mutable objects). Вторая - неизменяемыми объектами (immutable objects)...
3 недели назад
Почему число нельзя изменить так же, как список?
В предыдущей статье мы увидели довольно странное на первый взгляд поведение: a = [1, 2] b = a a.append(3) print(b) # [1, 2, 3] Создаётся ощущение, будто Python “связывает” переменные между собой. На самом деле никакой связи между переменными нет - есть только один объект, к которому привязано несколько имён. Но теперь возникает очень естественный вопрос. Если список можно изменить “на месте”, почему тогда с числами всё ведёт себя иначе? Рассмотрим похожий пример: x = 10 y = x x = 20 print(y) И здесь результат уже совершенно другой: 10 Переменная y осталась равной 10, хотя мы явно изменили x...
4 недели назад
Почему список меняется в двух переменных?
В прошлой статье мы выяснили, что переменные в Python не хранят данные внутри себя. Вместо этого имя просто ссылается на объект. Для чисел это выглядит довольно естественно: x = 10 y = x Обе переменные ссылаются на один и тот же объект со значением 10. Пока всё выглядит вполне логично. Но стоит перейти к спискам, как поведение Python начинает удивлять. Рассмотрим такой пример: a = [1, 2] b = a a.append(3) print(b) Многие ожидают увидеть: [1, 2] Ведь мы изменяли переменную a, а не переменную b. Однако Python выводит совсем другое: [1, 2, 3] Получается, что список изменился сразу в двух переменных...