为什么Python字符串是不可变的?使用它们的最佳实践
- 为什么Python的字符串是不可变的?这样设计有什么好处?
- 我习惯使用可变字符串,比如C语言中的那种。没有可变字符串我该怎么编程呢?有没有什么好的编程方法?
7 个回答
11
- 不可变对象是自动线程安全的。
- 你会发现,使用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:]