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

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

Mary-Kate Olsen
发布: 2024-12-02 02:23:11
原创
907 人浏览过

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板