为什么Pythonstring是不可变的? 使用它们的最佳实践

  1. 什么是使Pythonstring不可变的devise原因? 它如何使编程更容易?
  2. 我习惯了可变string,就像C中的那些字符一样。我应该如何编程而不使用可变string? 有没有最佳做法?

当你收到一个string,你会确定它保持不变。 假设你要用一个string参数构造一个Foo ,然后修改string; 那么Foo的名字会突然改变:

 class Foo(object): def __init__(self, name): self.name = name name = "Hello" foo = Foo(name) name[0] = "J" 

使用可变string时,您必须始终进行复制以防止发生不良事件。

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

最后,如果string不是不可变的,你不能可靠地将它们用作dict键,因为它们的哈希值可能会突然改变。

至于使用不可变string进行编程,只要习惯把数字看作是对待数字的方式:作为而不是对象。 改变name的第一个字母将是

 name = "J" + name[1:] 

不可变的string可以是字典和类似数据结构中的键,而不需要复制string。 在一个不可变的string周围做一个可变的包装比另一种方式更容易。

与Cstring相比,不可变string极大地简化了内存分配:你不会猜测长度和超额分配,希望你足够的分配过度。

它们更加安全:在C中,你永远不会有缓冲区溢出

只有一个可变string用例。

  • replace子string或单个字符

所有其他的string用例(连接,search等等)可变性并不重要。 在所有其他情况下,可变性并不重要。

如果你想在Python中replace一个字符或一个子string,你只需要创build一个新的string

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

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


由于我不明白的原因,添加以下内容似乎很重要。

“还有其他方法可以避免string缓冲区溢出而不是不可变的string。”

对于这个问题(关于Python,具体而言)不可变的string有没有缓冲区溢出一个愉快的结果。 对于其他语言,适用其他原则,规则和细微差别。

  1. 不可变的对象是自动线程安全的。
  2. 与使用C语言中的string相比,你会发现使用Pythonstring非常容易

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

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

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

如果string是可变的,你将不能够信任任何外部提供的string,因为恶意的调用者可能会改变它在你的下面。
这也会使multithreading变得更加困难。