首页 > 解决方案 > 是否有可能 python 字符串不像我想象的那样不可变?

问题描述

我正在尝试一些递归代码,其中我在递归函数的第一次调用之外创建一个字符串,并将该字符串作为参数发送给所述第一次调用。这个字符串在递归算法中被传递了很多次。

在这个函数内部,字符串使用+=. 这个函数显然因为它的递归而被调用了很多。我假设对字符串的每次修改都不会无意中影响另一个函数,因为+=应该创建一个字符串的新实例,但似乎有时它确实会改变它并影响我函数的其他调用。

在此处输入图像描述

我做了一些挖掘(上图),发现在执行+=某个函数时有时它会保留它的id,尽管我不知道这是否证实了我的怀疑。

有人知道会发生什么吗?

标签: pythonstring

解决方案


这可能是一种内存管理优化,当您扩展对字符串末尾存在可用内存的字符串的唯一引用时,它会保持相同的 ID。在某些时候,预分配的内存块被填满,需要分配一个新的 ID。

为了确认这一点,如果您将 的副本存储a在列表中,您将在每次迭代中看到 id 更改(因为现在有多个对字符串的引用):

a = ""
b = []
for i in range(30):
    a += "A"
    b.append(a)
    print(id(a))

推荐阅读