答案 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)
答案 2 :(得分:8)
与C字符串相比,不可变字符串极大地简化了内存分配:你不会猜测长度和超量分配希望你分配得足够多。
它们更安全:您可以从不以超出C的方式覆盖缓冲区。
只有一个可变字符串用例。
所有其他字符串用例(连接,搜索等)可变性无关紧要。在所有其他情况下,可变性并不重要。
如果要在Python中替换字符或子字符串,只需创建一个新字符串
即可x = x[:place] + replacement + x[place+1:]
这是唯一的新颖或独特的代码。
由于我无法理解的原因,添加以下内容似乎很重要。
“除了不可变的字符串之外,还有其他方法可以避免字符串缓冲区溢出。”
出于这个问题的目的(特别是关于Python),不可变字符串具有无缓冲区溢出的令人愉快的结果。对于其他语言,适用其他原则,规则和细微差别。
答案 3 :(得分:6)
不可变字符串可以是字典和类似数据结构中的键,而无需复制字符串。与其他方式相比,围绕不可变字符串创建可变包装更容易。
答案 4 :(得分:3)
不可变字符串使编程变得更加容易,这也是C#和Java也使用它们的原因。
如果字符串是可变的,那么您将无法信任任何外部提供的字符串,因为恶意调用者可能会在您下面更改它。
这也会使多线程变得更加困难。
答案 5 :(得分:3)
大多数语言都有不可变的字符串。这包括Java,Python和C#。通常在连接字符串时,语言会分配一个全新的字符串,并将两个字符串的内容复制到新字符串中。
不变性确实使编程更容易。特别是在处理多线程环境时。