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

时间:2011-12-30 13:45:24

标签: python string immutability

  1. 使Python字符串不可变的设计原因是什么?它如何使编程更容易?
  2. 我习惯了可变字符串,就像C语言中的字符串一样。如果没有可变字符串,我应该如何编程呢?有没有最好的做法?

6 个答案:

答案 0 :(得分:44)

当你收到一个字符串时,你会确定它保持不变。假设您使用字符串参数构造如下Foo,然后修改字符串;然后Foo的名字会突然改变:

class Foo(object):
    def __init__(self, name):
        self.name = name

name = "Hello"
foo = Foo(name)
name[0] = "J"

使用可变字符串,您必须始终制作副本以防止发生不良事件。

它还允许单个字符与长度为1的字符串没有区别,因此所有字符串运算符也适用于字符。

最后,如果字符串不是不可变的,则无法将它们可靠地用作dict中的键,因为它们的哈希值可能会突然改变。

对于使用不可变字符串进行编程,只需习惯用它来处理它们的方式与处理数字相同:as values ,而不是对象。更改name的第一个字母将是

name = "J" + name[1:]

答案 1 :(得分:8)

  1. 不可变对象自动线程安全。
  2. 你会发现,与C语言中与字符串相关的极度痛苦相比,使用Python字符串非常容易。

答案 2 :(得分:8)

与C字符串相比,不可变字符串极大地简化了内存分配:你不会猜测长度和超量分配希望你分配得足够多。

它们更安全:您可以从不以超出C的方式覆盖缓冲区。

只有一个可变字符串用例。

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

所有其他字符串用例(连接,搜索等)可变性无关紧要。在所有其他情况下,可变性并不重要。

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

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

这是唯一的新颖或独特的代码。


由于我无法理解的原因,添加以下内容似乎很重要。

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

出于这个问题的目的(特别是关于Python),不可变字符串具有无缓冲区溢出的令人愉快的结果。对于其他语言,适用其他原则,规则和细微差别。

答案 3 :(得分:6)

不可变字符串可以是字典和类似数据结构中的键,而无需复制字符串。与其他方式相比,围绕不可变字符串创建可变包装更容易。

答案 4 :(得分:3)

不可变字符串使编程变得更加容易,这也是C#和Java也使用它们的原因。

如果字符串是可变的,那么您将无法信任任何外部提供的字符串,因为恶意调用者可能会在您下面更改它。
这也会使多线程变得更加困难。

答案 5 :(得分:3)

大多数语言都有不可变的字符串。这包括Java,Python和C#。通常在连接字符串时,语言会分配一个全新的字符串,并将两个字符串的内容复制到新字符串中。

不变性确实使编程更容易。特别是在处理多线程环境时。