为什么Python字符串是不可变的?使用它们的最佳实践

72 投票
7 回答
37233 浏览
提问于 2025-04-17 09:16
  1. 为什么Python的字符串是不可变的?这样设计有什么好处?
  2. 我习惯使用可变字符串,比如C语言中的那种。没有可变字符串我该怎么编程呢?有没有什么好的编程方法?

7 个回答

11
  1. 不可变对象是自动线程安全的。
  2. 你会发现,使用Python的字符串非常简单,这和在C语言中处理字符串的麻烦相比,简直轻松得多。
17

不可变字符串在内存分配上比C语言的字符串简单多了:你不用猜测字符串的长度,也不用担心分配的内存不够。

它们更安全:你永远不会像在C语言中那样出现缓冲区溢出的问题。

其实,只有一种情况下需要可变字符串。

  • 替换一个子字符串或单个字符

其他所有字符串的使用场景(比如连接字符串、搜索等等)中,字符串是否可变并不重要。在其他情况下,可变性并不影响结果。

如果你想在Python中替换一个字符或子字符串,你只需要创建一个新的字符串。

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

这就是唯一需要特别注意的代码。


出于我无法理解的原因,似乎还需要补充以下内容。

“除了不可变字符串,还有其他方法可以避免字符串缓冲区溢出。”

就这个问题(特别是关于Python)而言,不可变字符串的一个好处就是不会出现缓冲区溢出的问题。对于其他语言,还有其他原则、规则和细节需要注意。

63

当你收到一个字符串时,你可以放心它不会改变。假设你用一个字符串参数创建了一个 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:]

撰写回答