python - 是否有可能 python 字符串不像我想象的那样不可变?
问题描述
我正在尝试一些递归代码,其中我在递归函数的第一次调用之外创建一个字符串,并将该字符串作为参数发送给所述第一次调用。这个字符串在递归算法中被传递了很多次。
在这个函数内部,字符串使用+=
. 这个函数显然因为它的递归而被调用了很多。我假设对字符串的每次修改都不会无意中影响另一个函数,因为+=
应该创建一个字符串的新实例,但似乎有时它确实会改变它并影响我函数的其他调用。
我做了一些挖掘(上图),发现在执行+=
某个函数时有时它会保留它的id
,尽管我不知道这是否证实了我的怀疑。
有人知道会发生什么吗?
解决方案
这可能是一种内存管理优化,当您扩展对字符串末尾存在可用内存的字符串的唯一引用时,它会保持相同的 ID。在某些时候,预分配的内存块被填满,需要分配一个新的 ID。
为了确认这一点,如果您将 的副本存储a
在列表中,您将在每次迭代中看到 id 更改(因为现在有多个对字符串的引用):
a = ""
b = []
for i in range(30):
a += "A"
b.append(a)
print(id(a))
推荐阅读
- python-2.7 - 使用python从演示文稿中读取嵌入对象
- c# - System.Diagnostics.Process 源中的空尝试 {},没有捕获,最终填充{} - 它有什么用?
- java - 鉴于调试器命中了我在控制器中设置的断点,Spring Boot 返回 404。我该如何解决?
- ionic-framework - 离子 livereload 到根页面,但需要最后加载的页面
- google-sheets - 使用间接函数来引用查询函数的串联导入范围
- python - 在字符串上应用正则表达式模式列表并返回找到的匹配项
- facebook-graph-api - Facebook Graph API Explorer 没有给我位置
- ruby - 替换 URL 字符串中的主机名
- android - 包含 proteus 库时出错 - “android.support.v7.appcompat.R$layout”
- wpf - 在 WPF 中使用 DevExpress ChartControl 和数据网格