Ser*_*gey 49 python string immutability
Fre*_*Foo 47
收到字符串后,您将确保它保持不变.假设您Foo
使用字符串参数构造如下所示,然后修改字符串; 那个Foo
名字会突然改变:
class Foo(object):
def __init__(self, name):
self.name = name
name = "Hello"
foo = Foo(name)
name[0] = "J"
Run Code Online (Sandbox Code Playgroud)
使用可变字符串,您必须始终制作副本以防止发生不良事件.
它还允许单个字符与长度为1的字符串没有区别,因此所有字符串运算符也适用于字符.
最后,如果字符串不是不可变的,则无法将它们可靠地用作a中的键dict
,因为它们的哈希值可能会突然改变.
至于使用不可变字符串进行编程,只需习惯以对待数字的方式对待它们:作为值,而不是对象.改变第一个字母name
是
name = "J" + name[1:]
Run Code Online (Sandbox Code Playgroud)
S.L*_*ott 11
与C字符串相比,不可变字符串极大地简化了内存分配:您不会猜测长度并且过度分配希望您过度分配.
它们更安全:你永远不会在C中以超出你的方式使用缓冲区.
只有一个可变字符串用例.
所有其他字符串用例(连接,搜索等)的可变性并不重要.在所有其他情况下,可变性并不重要.
如果要在Python中替换字符或子字符串,只需创建一个新字符串即可
x = x[:place] + replacement + x[place+1:]
Run Code Online (Sandbox Code Playgroud)
这是唯一的新颖或独特的代码.
由于我无法理解的原因,添加以下内容似乎很重要.
"除了不可变的字符串之外,还有其他方法可以避免字符串缓冲区溢出."
出于这个问题的目的(特别是关于Python),不可变字符串具有无缓冲区溢出的令人愉快的结果.对于其他语言,适用其他原则,规则和细微差别.