Почему строки Python неизменяемы? Рекомендации по их использованию

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

6 ответов


когда вы получите строку, вы будете уверены, что она останется прежней. Предположим, что вы построите 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:]

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

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

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

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

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

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

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

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


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

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

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


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

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


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

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


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

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