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

新手上路,请多包涵
  1. 使 Python 字符串不可变的设计原因是什么?它如何使编程更容易?
  2. 我已经习惯了可变字符串,比如 C 语言中的字符串。如果没有可变字符串,我该如何编程?有什么最佳实践吗?

原文由 Sergey 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 734
2 个回答

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

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

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

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

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

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

至于使用不可变字符串进行编程,只需习惯以与对待数字相同的方式对待它们:作为 _值_,而不是对象。更改 name 的第一个字母将是

name = "J" + name[1:]

原文由 Fred Foo 发布,翻译遵循 CC BY-SA 3.0 许可协议

与 C 字符串相比,不可变字符串极大地简化了内存分配:您不会猜测长度并过度分配希望您过度分配足够。

它们更安全:您 永远不会 像在 C 中那样让缓冲区溢出。

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

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

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

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

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

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


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

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

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

原文由 S.Lott 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题