Страницы

Поиск по вопросам

воскресенье, 22 декабря 2019 г.

Неизменяемость в python

#python


Не могу толком понять в python тему неизменяемость.
К примеру:
a = 5
a = 10
Вывод 10, т.е. переменная a уже не 5 а 10, как-бы изменилась. Или здесь что-то другое
имеется ввиду?
    


Ответы

Ответ 1



В среде Python-программистов есть такое изречение "В python-е все есть объект". Когда программист присваивает что-то в переменную, то он присваивает не само значение, а ссылку на объект. В вашем примере сначала создается объект со значением 5, берется его адрес(грубо, очень грубо) и присваивается переменной a. Затем создается объект в котором хранится 10, берется его адрес и этот адрес присваивается в a. Далее, объект со значением 5 живет до тех пор, пока его garbage collector не решит отправить к праотцам. Еще раз, все операции в Python-е ведутся относительно объектов. Когда говорят о mutable или immutable то имееют ввиду свойства объектов! Возможно Вам просто непонятна концепция "указатель" и поэтому приведу аналогию из мира людей: Когда Вы берете в руки смартфон и звоните к Ане, чтобы поговорить, то вы говорите не с номером телефона и не со смартфоном, а с Аней. Номер телефона всего лишь "указатель" на Аню. А смартфон это переменная, которая хранит указатель на Аню. И чтобы получить доступ к Ане вы используете переменнную в которой хранится номер Ани и только тогда вы получаете доступ к ней.

Ответ 2



Во всех русскоязычных переводах используется терминология «изменяемый-неизменяемый». Это не самый удачный вариант, так как он вносит неоднозначность, ассоциируясь с некоей константностью. Термины "мутирующий-немутирующий" были бы уместнее и точнее отображали бы суть происходящего: может ли объект этого типа изменять свою структурность? Например: строка s = 'abcdef' - это неизменяемый тип, так как в Python нельзя, в отличие от C/C++ изменить некоторый одиночный символ в строке, например, через s[ 2 ] = 'z', не говоря уже о том, чтобы вставить символ внутрь строки. Но можно сделать s = s[ :2 ] + 'z' = s[ 3: ] и получить в результате, требуемую строку 'abzdef', только это будет совершенно другая строка, размещённая по совершенно другому адресу в памяти, а s — переустановленная ссылка на эту новую строку. Но изменить строку или её длину (её структурность) по текущей ссылке — невозможно. В этом и состоит неизменяемость объекта — это не константность, так как его значение можно изменить, но это будет уже ссылка на другой объект с этим новым значением.

Ответ 3



Целое число в Питоне неизменяемо (immutable). В вашем примере никакие объекты не меняются. Сначала имя a ссылается на объект 5, а потом имя a ссылается на другой объект 10 (просто бирку с одного объекта на другой переместили). Вот хорошая иллюстрация того что происходит.

Комментариев нет:

Отправить комментарий