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

6 投票
3 回答
936 浏览
提问于 2025-04-15 18:51

我想改变一个特定字符串位置的值,但不幸的是

string[4] = "a"

会出现一个TypeError错误,因为字符串是不可变的(“不支持项赋值”)。

所以我只能使用一种比较笨拙的方法

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

有没有更好的方法来做到这一点呢?

3 个回答

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

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

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

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

9

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

  • 从设计上讲,Python中的字符串被认为是基本的、不可改变的。这促进了更好、更安全的编程风格。
  • 字符串的不可变性在效率上也有好处,主要是在存储需求上更低。
  • 这也使得字符串作为字典的键时更安全。

如果你在Python的相关网站上多逛逛,你会发现,关于“如何改变我的字符串”的建议中,最常见的就是“设计你的代码,使你不需要去改变它”。这倒是有道理,但还有其他选择吗?这里有几个:

  • name = name[:2] + ‘G’ + name[3:] - 这是一种效率不高的方法。Python的切片语法确保在所有情况下都能正确工作(只要你的索引在范围内),但涉及到多个字符串的复制和拼接,这并不是高效代码的最佳选择。不过,如果你不太在意效率(大多数情况下你可能不在意),这也是一个不错的解决方案。
  • 使用UserString模块中的MutableString类。虽然它的效率和前面的方法一样(底层实现是一样的),但在语法上更符合普通字符串的使用。
  • 使用列表来存储可变数据,而不是字符串。可以通过列表和连接操作来进行转换。根据你的实际需求,ord和chr也可能会有用。
  • 使用数组对象。如果你用字符串来存储一些有限的数据,比如‘二进制’字节,并且想要快速的代码,这可能是你最好的选择。

内容摘自我自己的页面,关于Python的见解 :-)

撰写回答