Почему строки Python неизменяемы?Лучшие практики для их использования - PullRequest
47 голосов
/ 30 декабря 2011
  1. Каковы конструктивные причины, по которым строки Python неизменяемы?Как это облегчает программирование?
  2. Я привык к изменяемым строкам, как в C. Как я должен программировать без изменяемых строк?Есть ли лучшие практики?

Ответы [ 6 ]

45 голосов
/ 30 декабря 2011

Когда вы получите строку, вы будете уверены, что она останется прежней. Предположим, что вы создадите Foo, как показано ниже, со строковым аргументом, а затем измените строку; тогда имя Foo внезапно изменится:

class Foo(object):
    def __init__(self, name):
        self.name = name

name = "Hello"
foo = Foo(name)
name[0] = "J"

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

Это также обеспечивает удобство, состоящее в том, что отдельный символ ничем не отличается от строки длиной один, поэтому все строковые операторы также применяются к символам.

И, наконец, если строки не являются неизменяемыми, вы не можете надежно использовать их в качестве ключей в dict, поскольку их значение хеш-функции может внезапно измениться.

Что касается программирования с неизменяемыми строками, просто привыкните обращаться с ними так же, как с числами: как значения , а не как объекты. Изменение первой буквы name будет

name = "J" + name[1:]
10 голосов
/ 30 декабря 2011

Неизменяемые строки значительно упрощают распределение памяти по сравнению со строками C: вы не угадываете длину и перераспределяете, надеясь, что вы перераспределите достаточно.

Они более безопасны: вы можете никогда иметь переполнение буфера, как вы можете в C.

Существует только один вариант использования изменяемой строки.

  • замена подстроки или одного символа

Все другие варианты использования строки (конкатенация, поиск и т. Д. И т. Д.), Изменчивость не имеет значения. Во всех остальных случаях изменчивость не имеет значения.

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

x = x[:place] + replacement + x[place+1:]

Это единственный код, который является новым или отличительным.


По причинам, которые я не понимаю, важно добавить следующее.

"Существуют другие способы избежать переполнения буфера строк, кроме неизменяемых строк."

Для целей этого вопроса (в частности, о Python) неизменяемые строки имеют приятное следствие отсутствия переполнения буфера. Для других языков применяются другие принципы, правила и нюансы.

8 голосов
/ 30 декабря 2011
  1. Неизменяемые объекты автоматически являются поточно-ориентированными.
  2. Вы обнаружите, что использование строк Python тривиально просто по сравнению с чрезвычайной болью, связанной со строками в C.
7 голосов
/ 30 декабря 2011

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

3 голосов
/ 30 декабря 2011

Большинство языков имеют неизменяемые строки.Это включает в себя Java, Python и C #.Обычно при конкатенации строк язык выделяет совершенно новую строку и копирует содержимое этих двух строк в новую строку.

Неизменность, как правило, облегчает программирование.Особенно когда речь идет о многопоточной среде.

3 голосов
/ 30 декабря 2011

Неизменяемые строки значительно упрощают программирование, поэтому в C # и Java их тоже используют.

Если бы строки были изменяемыми, вы не смогли бы доверять какой-либо внешней строке, поскольку злоумышленник мог измениться.это под вами.
Это также усложнит многопоточность.

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