Преодоление “недостатков” строковой неизменности

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

string[4] = "a"

повышения a TypeError, потому что строки неизменны ("присвоение объекта, не поддерживается").

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

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

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

6
задан 3 February 2010 в 16:58
поделиться

3 ответа

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

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

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

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

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

9
ответ дан 9 December 2019 в 20:43
поделиться
mystring=list("abcdef")
mystring[4]="Z"
print ''.join(mystring)
3
ответ дан 9 December 2019 в 20:43
поделиться
>>> from UserString import MutableString
>>> s = MutableString('abcd')
>>> s[2] = 'e'
>>> print s
abed
0
ответ дан 9 December 2019 в 20:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: