首页 > 解决方案 > CPython:为什么 += 字符串会改变字符串变量的 id

问题描述

Cpython对字符串自增操作进行了优化,当为一个字符串初始化内存时,程序会为它留出额外的扩展空间,所以在自增时,原字符串不会被复制到新的位置。我的问题是为什么字符串变量的 id 会发生变化。

>>> s = 'ab'
>>> id(s)
991736112104
>>> s += 'cd'
>>> id(s)
991736774080

为什么字符串变量的 id 会发生变化。

标签: pythonpython-3.xcpythonpython-internals

解决方案


字符串是不可变的。+=在 a上使用str不是就地操作;它创建一个具有新内存地址的新对象,这就是id()CPython 的实现。


具体来说str__iadd__没有定义,所以操作回退到一个__add____radd__。有关详细信息,请参阅 Python 文档的数据模型部分。

>>> hasattr(s, '__iadd__')                                                                                                                                
False

推荐阅读