为什么Pythonstring是不可变的? 使用它们的最佳实践
- 什么是使Pythonstring不可变的devise原因? 它如何使编程更容易?
- 我习惯了可变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有没有缓冲区溢出一个愉快的结果。 对于其他语言,适用其他原则,规则和细微差别。
- 不可变的对象是自动线程安全的。
- 与使用C语言中的string相比,你会发现使用Pythonstring非常容易
大多数语言都有不变的string。 这包括Java,Python和C#。 通常,在连接string时,语言会分配一个全新的string,并将两个string的内容复制到新string中。
不变性确实会使编程更容易。 特别是在处理multithreading环境时。
不可变的string使编程更容易,这也是C#和Java也使用它们的原因。
如果string是可变的,你将不能够信任任何外部提供的string,因为恶意的调用者可能会改变它在你的下面。
这也会使multithreading变得更加困难。