Преодоление «недостатков» неизменности строк - PullRequest
6 голосов
/ 03 февраля 2010

Я хочу изменить значение определенного строкового индекса, но, к сожалению,

string[4] = "a"

повышает TypeError, потому что строки неизменны («назначение элемента не поддерживается»).

Так что вместо этого я использую довольно неуклюжий

string = string[:4] + "a" + string[4:]

Есть ли лучший способ сделать это?

Ответы [ 3 ]

9 голосов
/ 03 февраля 2010

Строки в Python являются неизменяемыми, как числа и кортежи. Это означает, что вы можете создавать их, перемещать их, но не изменять их. Почему это так? По нескольким причинам (вы можете найти лучшее обсуждение в Интернете):

  • По своей конструкции строки в Python считаются элементарными и неизменяемыми. Это подстегнет лучше, безопаснее стили программирования.
  • Неизменность строк имеет преимущества в эффективности, главным образом в области более низких требований к хранению.
  • Это также делает строки более безопасными для использования в качестве словарных ключей

Если вы немного загляните в сеть Python, вы заметите, что наиболее частый совет «как изменить мою строку» - «создайте свой код так, чтобы вам не пришлось его менять». Справедливо, но какие еще есть варианты? Вот некоторые из них:

  • name = name [: 2] + ‘G’ + name [3:] - это неэффективный способ выполнить работу. Семантика фрагментов Python гарантирует, что это работает корректно во всех случаях (если ваш индекс находится в диапазоне), но с использованием нескольких копий строк и конкатенаций, это едва ли ваш лучший выстрел в эффективный код. Хотя, если вы не заботитесь об этом (и, скорее всего, вам это не нужно), это надежное решение.
  • Используйте класс MutableString из модуля UserString. Хотя он не более эффективен, чем предыдущий метод (он выполняет тот же трюк под капотом), он более синтаксически согласуется с обычным использованием строк.
  • Используйте список вместо строки для хранения изменяемых данных. Конвертировать туда и обратно, используя список и присоединиться. В зависимости от того, что вам действительно нужно, ord и chr также могут быть полезны.
  • Использовать объект массива. Это, пожалуй, лучший вариант, если вы используете строку для хранения ограниченных данных, таких как двоичные байты, и хотите быстрый код.

Плагиат с моей собственной страницы на Python: -)

3 голосов
/ 03 февраля 2010
mystring=list("abcdef")
mystring[4]="Z"
print ''.join(mystring)
0 голосов
/ 03 февраля 2010
>>> from UserString import MutableString
>>> s = MutableString('abcd')
>>> s[2] = 'e'
>>> print s
abed
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...