Подтвердить что ты не робот

Какова теория заменяемых и неизменяемых типов?

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

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

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

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

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

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

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

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

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

Есть, на мой взгляд, две разные опасности при таком подходе:

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

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