Какова теория изменчивых и неизменных типов? - PullRequest
18 голосов
/ 02 июля 2011

Одна из вещей, которыми я восхищаюсь в Python, это его различие между изменяемыми и неизменяемыми типами.Потратив некоторое время на программирование на c, прежде чем перейти на Python, я был поражен тем, насколько легко Python устраняет все сложности разыменования указателей, которые сводят меня с ума в c.В Python все просто работает так, как я ожидал, и я быстро понял, что важное значение в этом играет различие между изменяемыми и неизменяемыми.

Конечно, есть еще несколько складок (по умолчанию переменный аргумент изменяемой функции является заметнымпример) но в целом, я чувствую, что изменчивое / неизменное различие значительно проясняет вопрос о том, какие переменные и их значения равны и как они должны себя вести.

Но откуда это?Я должен предположить, что GvR был не первым человеком, который осознал это различие, и что Python был не первым языком, который использовал его.Мне интересно услышать о более ранних языках, которые использовали эту концепцию, а также о ранних теоретических обсуждениях этого вопроса.

Ответы [ 4 ]

7 голосов
/ 02 июля 2011

Если вам нравится идея неизменности, вы должны проверить чисто функциональный язык.В Haskell все (чистые) переменные являются неизменяемыми (но все еще упоминаются как «переменные», но вы идете).Это отличная идея - вы и компилятор оба знаете, что передача чего-либо в функцию никак не может изменить это.

5 голосов
/ 02 июля 2011

В C нет явного понятия неизменяемого, потому что язык основан на семантике копирования. Вместо этого в Python значения всегда передаются по ссылке, и неизменность играет важную роль для поддержания управляемости языка.

В Python у вас нет указателей, потому что все действительно является указателем! Представьте себе, что это может означать для программы на Python, что даже числовые объекты могут со временем менять значение ... вы будете вынуждены играть такие трюки, как

class Shape:
    def __init__(self, points):
        self.points = points[:] # make a copy of the list

не только для списков и надписей, но также для числовых значений и строк.

Так что в основном в Python некоторые типы имеют неизменяемые экземпляры, потому что они обычно используются в качестве «значений», а вас не волнует идентичность. В тех редких случаях, когда вам нужен, например, изменяемый объект с числовым значением, вам необходимо явно обернуть его, скажем, в экземпляр класса.

В других языках, в значительной степени основанных на эталонной семантике, такой как неизменность LISP, выбор остается за программистом, а не ограничением, даже если многие функции и идиомы поддерживают его (большой процент функций стандартной библиотеки LISP не является деструктивным, и это действительно так. Это позор, что деструктивные не всегда четко различимы по названию.

Так, например, строки являются изменяемыми LISP, но, вероятно, не многие программы LISP на самом деле модифицируют строки на месте, потому что это означало бы отказ от хорошей возможности совместного использования и потребовало бы явного копирования строк во многих местах (в большинстве случаев строки являются просто значениями, не объекты, в которых вы заботитесь о личности). Являются ли строки неизменяемыми в LISP? Нет. Программы меняют их? Почти никогда.

Не оставлять выбор программисту в духе языка Python. Приятно, когда решения, которые вы вынуждены делать, соответствуют вашей идее ... меньше решений и вещей точно так, как вы того хотели.

Однако, по моему мнению, при таком подходе есть две разные опасности:

  1. Проблемы возникают, когда эти заранее сделанные выборы НЕ соответствуют тому, что вы хотели бы или должны сделать. Python - замечательный язык, но с другим диктатором может стать настоящий ад.

  2. Понимание и принятие решений заставляет вас думать и расширять ваш разум. Вместо того, чтобы делать выбор, вы просто ставите клетку на ум, и через некоторое время вы можете даже не осознавать, что то, что вы используете, это ОДНА возможность, а не единственная возможность. Через некоторое время вы можете начать думать, что «все ДОЛЖНО быть сделано таким образом»: вы даже не чувствуете, что вас принуждают, потому что ваш ум уже «изуродован».

4 голосов
/ 02 июля 2011

Objective C загружен с изменчивыми / неизменными различиями (к точке, где есть и NSString и NSMutableString, например); это предшествует Python примерно на 8 лет. Smalltalk, от которого Objective C унаследовал большую часть своего ОО-проекта, использует концепцию в меньшей степени (в частности, строки не являются неизменяемыми; в наши дни наблюдается тенденция к неизменным строкам, как в Python, Ruby и т. Д.).

0 голосов
/ 02 июля 2011

Я бы рекомендовал прочитать следующие записи из Википедии:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...