Python 字符串为什么不可变:从 replace 到变量重绑定
Python 字符串为什么不可变:从 replace 到变量重绑定 副标题: replace 看起来修改了字符串,实际发生的是创建结果并让变量改指向它。理解这一区别,才能看懂字符串方法、别名行为和循环拼接的成本。 适读人群: 刚开始学习 Python 字符串、变量与对象关系的读者 阅读时间: 6 分钟 从一段括号消除代码说起 下面的函数反复删除成对的括号,直到字符串不再变化: def is_valid_by_elimination(s: str) -> bool: while True: previous = s s = s.replace("()", "").replace("[]", "").replace("{}", "") if len(s) == len(previous): return s == "" 这里容易产生一个疑问: previous = s s = s.replace("()", "") 既然 previous 和 s 原来指向同一个字符串,第二行为什么不会同时改变 previous? 答案是:Python 字符串是不可变对象。replace 没有修改原字符串,而是计算出一个 结果,随后赋值语句让变量 s 改为指向这个结果。previous 仍然指向原字符串。 “不可变”到底是什么意思 字符串不可变,指的是: 一个 str 对象创建以后,它所表示的字符序列不能被原地修改。 例如: text = "cat" text[0] = "b" Python 会抛出异常: TypeError: 'str' object does not support item assignment 不能把已有字符串中的 c 原地改成 b。如果需要 "bat",必须得到另一个字符串值: ...