【发布时间】:2021-06-06 13:04:55
【问题描述】:
在我读的一本书中,我了解到标准的字符串连接可能很难记忆,因为它每次都会复制字符串本身并添加新值。
message = message + chr(codeNum)
我想知道 += 运算符是否相同。
message += chr(codeNum)
我在其他语言上看到了一些类似的主题,但我的问题主要是关于 Python 的。你能在这方面提供一些知识吗?
【问题讨论】:
-
Python 字符串是不可变的,因此加法操作是二进制还是内联都没有关系——无论哪种方式,结果都是不同于原始字符串的结果,因此将创建一个包含所有字符串的新字符串相关的开销。
-
发生的情况是字符串是不可变的,一旦它绑定到一个变量就不可能改变它。当一个字符串被“修改”时,它实际上是一个重新分配给同一个变量的新字符串。所以我会说使用什么运算符进行连接没有显着差异。
-
CPython 实现中有一个奇怪且有些脆弱的优化,它试图可变地执行此操作,但优化并不关心您使用
+还是+=。 -
(不要依赖奇怪的优化。建立一个要连接的东西列表并使用
''.join一次性连接所有内容。这适用于所有 Python 实现,并且保证不会降级为二次性能。) -
在某些语言中,通过重复连接构建长字符串是一种习惯用法,就像您在示例中所做的那样。因为在 Python 中这样做是低效的,所以习惯用法是组装一个短字符串的临时列表(扩展一个列表比重新分配一个字符串更有效)并通过一次调用
join()创建一个长字符串,当列表已完成。
标签: python memory memory-management concatenation accumulator