Почему строки Python и кортежи, сделаны неизменными?

изучите вложенные наборы модель иерархии. это довольно прохладно и полезно.

49
задан Tim Cooper 24 September 2011 в 14:39
поделиться

5 ответов

Один из них - производительность: зная, что строка неизменяема позволяет легко выложить во время строительства - фиксированное и неизменное хранилище требования. Это тоже один из причины различия между кортежи и списки. Это также позволяет реализация для безопасного повторного использования строки объекты. Например, CPython реализация использует заранее выделенные объекты для односимвольных строк, и обычно возвращает оригинал строка для строковых операций, которые не изменяет содержимое.

Другой пример - строки в Python считаются "элементальными", поскольку числа. Никакая активность не будет измените значение 8 на любое другое, а в Python нет активности изменит строку «восемь» на что-нибудь еще.

http://effbot.org/pyfaq/why-are-python-strings-immutable.htm

33
ответ дан 7 November 2019 в 11:27
поделиться

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

9
ответ дан 7 November 2019 в 11:27
поделиться

плюсы: Производительность

минусы: можно Не меняет изменяемые.

3
ответ дан 7 November 2019 в 11:27
поделиться

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

Два места для разрыва соединения - это соединение: DidFinishLoading и соединение: didFailWithError.

Ключи словаря могут быть хорошим примером этого:

mykey = 'abc'
mydict = {
    mykey: 123,
    'zbc': 321
}

anotherstring = mykey
anotherstring[0] = 'z'

Теперь в FakeMutablePython все становится довольно странным - у вас изначально есть два ключа в словаре, «abc» и «zbc». Затем вы изменяете строку «abc» (через идентификатор anotherstring ) на «zbc», поэтому у dict есть два ключа, «zbc» и «zbc» ...

Одно из решений этой странности - каждый раз, когда вы назначаете строку идентификатора (или используйте его как ключ dict), он копирует строку с 0x1 в 0x2.

Это предотвращает описанное выше, но что, если у вас есть строка, для которой требуется 200 МБ памяти?

a = "really, really long string [...]"
b = a

Внезапно ваш сценарий занимает 400 МБ памяти? Это не очень хорошо.

А что, если мы укажем ему тот же адрес памяти, пока мы его не изменим? Копировать при записи . Проблема в, это может быть довольно сложно сделать ..

Вот тут и появляется неизменность .. Вместо того, чтобы требовать от метода .replace () скопировать строку из памяти в новый адрес, затем изменить ее и return .. Мы просто делаем все строки неизменяемыми, и поэтому функция должна создать новую строку для возврата. Это объясняет следующий код:

a = "abc"
b = a.replace("a", "z")

И подтверждается:

>>> a = 'abc'
>>> b = a
>>> id(a) == id(b)
True
>>> b = b.replace("a", "z")
>>> id(a) == id(b)
False

(функция id () возвращает адрес памяти объекта)

74
ответ дан 7 November 2019 в 11:27
поделиться

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

4
ответ дан 7 November 2019 в 11:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: