【问题标题】:Is it possible python strings are not as inmutable as I had thought? [duplicate]是否有可能 python 字符串不像我想象的那样不可变? [复制]
【发布时间】:2021-11-16 03:27:53
【问题描述】:

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

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

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

有人知道会发生什么吗?

【问题讨论】:

    标签: python string


    【解决方案1】:

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

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

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

    【讨论】:

    • 如果你把循环变大并计​​算有多少字符串使用相同的 ID,你会看到 python 只是分配 16 字节的块,这很常见。
    • 在我的 64 位 MacOS 笔记本电脑上,每 8 次分配就会改变一次。 (可能因操作系统而异)
    • 这很有趣。同样在 Mac 上看到 16 字节的块。可以肯定地说它依赖于实现:)。
    • 我在 Pyhton 3.7 上。这也可以解释
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-15
    • 2021-05-03
    • 2013-05-08
    • 1970-01-01
    • 2015-07-02
    • 2021-12-25
    • 2015-05-16
    相关资源
    最近更新 更多