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

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

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

Ответ 1

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

Ответ 2

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

Ответ 3

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

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

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

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

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

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

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

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


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

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

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

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