当我尝试使用+=运算符修改字符串,并使用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。
当我尝试使用+=运算符修改字符串,并使用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。
b = a
在第二个a += '1'
之前应该不会对输出产生任何影响。 但它确实有影响。
原因是因为在“增量”之前的字符串a
不再被任何地方使用,其id可以被重新使用。但通过将该字符串分配给b
,现在它被用在某个地方,并且新的字符串a
不能重复使用该id。
a += b
或a = a + b
的语句的原地字符串连接的高效实现。即使在CPython中,这种优化也很脆弱(它仅适用于某些类型),而且在不使用引用计数的实现中根本不存在。” - ShadowRanger