首页 >后端开发 >Python教程 >为什么 Python 的 id() 会改变不可变字符串?

为什么 Python 的 id() 会改变不可变字符串?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-02 02:23:11973浏览

Why Does Python's `id()` Change for Immutable Strings?

Python 字符串中的可变性和对象标识

Python 字符串的不变性意味着它们一旦创建就无法更改。然而,由 id() 函数表示的对象标识对于字符串来说可能会发生变化,从而导致混乱。

字符串的 id() 行为

一般来说,字符串的 id()每次调用时都会发生变化,即使对于相同的字符串文字也是如此。这是因为 Python 不保证默认情况下实习所有字符串。

id('so')
140614155123888
id('so')
140614155123848
id('so')
140614155123808

但是,也有例外。满足以下条件的字符串将被保留并保持相同的 id():

  • 存储在代码对象中的常量
  • 仅包含 ASCII 字母、数字或下划线的字符串

变量作用域和实习

将字符串分配给变量可以影响其 id() 行为。当变量引用字符串时,Python 通过使用内部版本将字符串的值存储在内存中一次来优化性能。

so = 'so'
id('so')  # Now references the same interned string as 'so'
140614155123728

Interning 行为的来源

Python 内部使用一个函数来称为 intern_string_constants() 的内部字符串。此函数适用于满足前面提到的条件的字符串(例如,示例中的“hello”)。

实习和优化

Python 的编译器和优化器也在实习中发挥作用。代码对象工厂函数可以保留任何可以表示为有效标识符的字符串(例如,第二个示例中的“so”)。此外,窥视孔或 AST 优化器可以折叠涉及常量的简单表达式,从而产生中间结果。

结论

虽然 Python 的字符串是不可变的,但它们的 id() 可以改变,具体取决于以下因素:实习、变量范围和优化器行为。实习有助于优化内存使用和性能,了解其行为以避免潜在的混乱非常有价值。

以上是为什么 Python 的 id() 会改变不可变字符串?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn