Python: Неизменяемость и примитивные типы
Рассмотрим функцию abs()
, которая делает число неотрицательным:
balance = -200
amount = abs(balance)
print(amount) # => 200
На экран выведется 200
.
Но что будет выведено на экран, если вызвать print(balance)
? Выведется старое значение: -200
.
Функция abs()
вернула новые данные, но не изменила переданные в неё данные. Она не могла это сделать физически, потому что примитивные типы в Python — неизменяемы.
(Напомним, что примитивные типы — это простые типы, встроенные в сам язык программирования: например, число или строка).
В будущих уроках и заданиях мы будем использовать как собственные функции, так и функции из стандартной библиотеки, но никакие функции не смогут изменять данные примитивных типов.
Число -200
— это значение переменной balance
, и само число нельзя изменить. Но переменная называется переменной, потому что её значение можно заменить на другое значение.
То есть мы можем написать:
balance = -200
balance = abs(balance)
print(balance)
Сначала в переменную записывается одно значение, а потом в ту же переменную вместо предыдущего значения записывается новое: то, что вернет вызов abs(balance)
.
Строку balance = abs(balance)
можно прочитать так: «записать в переменную balance
то, что вернет вызов функции abs()
если передать в неё текущее значение переменной balance
».
Мы не изменили число, мы изменили переменную — записали в неё новое число вместо старого.
Изменение уже существующей переменной может показаться безобидным действием. Но в реальных программах переписывание переменной становится источником проблем. Код с изменяемыми переменными сложно понимать и анализировать: никогда нельзя быть уверенным, какое значение будет у переменной в какой-то момент времени.
Вы наверняка регулярно сталкиваетесь с багами и ошибками в приложениях, которые используете. Многие вызваны именно обилием изменяемых переменных: такие ошибки сложно найти и исправить.
Единственное место, где без переменных никак — это циклы, с которыми мы познакомимся позже. Во всех остальных местах относитесь к переменным как к константам — неизменяемым сущностям. Создавайте переменные, задавайте им значение и больше не меняйте.
Задание
Переведите число, записанное в переменную value
, в шестнадцатиричный вид, используя функцию hex()
. Новое значение (а это уже будет строка!) запишите в ту же переменную value
.
Возможно, вам покажется, что код получился странным. Это типичный пример: переписывание переменных делает код менее понятным и более запутанным, особенно в таких случаях, как этот — когда новое значение имеет тип, отличающийся от типа старого значения.
Пожалуйста, авторизуйтесь, это необходимо для отслеживания прогресса выполнения уроков. Если у вас ещё нет учётной записи, то сейчас самое время создать аккаунт.