克服字符串不变性的“缺点”

时间:2010-02-03 16:58:19

标签: python string immutability

我想更改特定字符串索引的值,但不幸的是

string[4] = "a"

引发TypeError,因为字符串是不可变的(“不支持项目分配”)。

所以我使用相当笨拙的

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

有更好的方法吗?

3 个答案:

答案 0 :(得分:8)

Python中的字符串是不可变的,就像数字和元组一样。这意味着您可以创建它们,移动它们,但不能更改它们。为什么会这样?有几个原因(你可以在网上找到更好的讨论):

  • 根据设计,Python中的字符串被认为是元素且不可更改的。这会刺激更好,更安全的编程风格。
  • 字符串的不变性具有效率优势,主要是在存储要求较低的领域。
  • 它还使字符串更安全地用作字典键

如果你仔细观察Python网页,你会发现“如何改变我的字符串”最常见的建议是“设计你的代码,这样你就不必改变它”。很公平,但还有其他选择吗?以下是一些:

  • name = name [:2] +'G'+ name [3:] - 这是一种低效的工作方式。 Python的切片语义确保在所有情况下都能正常工作(只要你的索引在范围内),但涉及多个字符串副本和连接,这对于高效代码来说几乎不是最好的。虽然如果你不关心这一点(并且大部分机会都没有),这是一个可靠的解决方案。
  • 使用模块UserString中的MutableString类。虽然没有比以前的方法更有效(它在引擎盖下执行相同的技巧),但它在语法上与正常的字符串使用更加一致。
  • 使用列表而不是字符串来存储可变数据。使用列表和连接来回转换。根据您的真实需要,ord和chr也可能有用。
  • 使用数组对象。如果您使用字符串来保存约束数据(例如“二进制”字节,并且想要快速代码),这可能是您的最佳选择。

my own page抄袭Python见解: - )

答案 1 :(得分:3)

mystring=list("abcdef")
mystring[4]="Z"
print ''.join(mystring)

答案 2 :(得分:0)

>>> from UserString import MutableString
>>> s = MutableString('abcd')
>>> s[2] = 'e'
>>> print s
abed