Python中的 += 操作符会使字符串可变吗?

4

当我尝试使用+=运算符修改字符串,并使用id()方法检查对象的标识时,字符串似乎是可变的。有人遇到过这样奇怪的Python行为吗?

a = '123'

print id(a)
# 89806008

a += '1'

print id(a)
# 89245728

a += '1'

print id(a)
# 89245728

print a

# '12311'

使用 a = a + '1' 并不会产生相同的效果,并且会改变字符串的 id。


3
那个问题是关于重新绑定字符串变量的一般性问题。这里是指新对象具有相同的内存地址,表示它是同一个对象。 - user2390182
@schwobaseggl 我明白了。 - Tai
也许 https://dev59.com/cmAf5IYBdhLWcg3w0VYf 上有这个问题的解释? - Roman Susi
2
也许解释器检测到"1231"不再使用,并将"12311"放置在同一内存位置。 - rrobby86
1个回答

9
如果您确认这个字符串是可变的,那么添加操作将会直接在原来的字符串上进行。
b = a

在第二个a += '1'之前应该不会对输出产生任何影响。 但它确实有影响。

原因是因为在“增量”之前的字符串a不再被任何地方使用,其id可以被重新使用。但通过将该字符串分配给b,现在它被用在某个地方,并且新的字符串a不能重复使用该id。


1
需要明确的是,这是CPython特定的优化(它只在基于引用计数的解释器中可靠地工作)。根据PEP8的编程建议,您不应该依赖它:“例如,不要依赖于CPython对形如a += ba = a + b的语句的原地字符串连接的高效实现。即使在CPython中,这种优化也很脆弱(它仅适用于某些类型),而且在不使用引用计数的实现中根本不存在。” - ShadowRanger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接