изучите вложенные наборы модель иерархии. это довольно прохладно и полезно.
Один из них - производительность: зная, что строка неизменяема позволяет легко выложить во время строительства - фиксированное и неизменное хранилище требования. Это тоже один из причины различия между кортежи и списки. Это также позволяет реализация для безопасного повторного использования строки объекты. Например, CPython реализация использует заранее выделенные объекты для односимвольных строк, и обычно возвращает оригинал строка для строковых операций, которые не изменяет содержимое.
Другой пример - строки в Python считаются "элементальными", поскольку числа. Никакая активность не будет измените значение 8 на любое другое, а в Python нет активности изменит строку «восемь» на что-нибудь еще.
http://effbot.org/pyfaq/why-are-python-strings-immutable.htm
Одним из больших преимуществ их неизменяемости является то, что их можно использовать в качестве ключей в словаре. Я уверен, что внутренние структуры данных, используемые словарями, сильно испортились бы, если бы ключи были изменены.
плюсы: Производительность
минусы: можно Не меняет изменяемые.
Вам нужно разорвать соединение, а не делегату. Я думаю, что класс 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 ()
возвращает адрес памяти объекта)
Неизменяемые типы концептуально намного проще, чем изменяемые. Например, вам не нужно возиться с конструкторами копирования или константной корректностью, как в C ++. Чем больше типов неизменяемо, тем проще становится язык. Таким образом, самые простые языки - это чисто функциональные языки без какого-либо глобального состояния (потому что лямбда-исчисление намного проще, чем машины Тьюринга, и столь же мощно), хотя многие люди, похоже, не понимают этого.