首页 > 后端开发 > Python教程 > 为什么不可变字符串 ID 在 Python 2.7 中会发生变化?

为什么不可变字符串 ID 在 Python 2.7 中会发生变化?

Mary-Kate Olsen
发布: 2024-12-23 16:22:18
原创
351 人浏览过

Why Do Immutable String IDs Appear to Change in Python 2.7?

为什么不可变字符串的 ID 会改变?

在 Python 2.7 中,字符串 ID 的行为可能会令人费解。虽然字符串是不可变的,但它们的 ID 似乎会随着时间而改变。本文探讨了此行为背后的原因。

Python 中的 Id Interning

默认情况下,CPython 不会对所有字符串进行实习。但是,可以使用 sys.intern() 函数或 PyCode_New 函数的 intern_string_constants() 调用来保留满足特定条件的字符串。驻留确保代码库中同一字符串的多次出现使用同一个对象。

符合驻留条件的字符串包括:

  • 存储在代码对象中的常量
  • 仅包含 ASCII 字母、数字或下划线的字符串
  • 同时分配给标识符和它的值(例如,so = 'so')

更改 ID

如果字符串不符合实习条件,则其 ID 将继续更改。这是因为 Python 可以自由地为新字符串重用内存位置,从而导致同一文字具有不同的 ID。

Interning 和字符串使用

ID 的行为取决于关于如何使用字符串:

  • 没有变量引用: 如果您调用多次 id('so') 而不将其分配给变量,ID 可能会更改,因为保留的字符串对象被丢弃。
  • 使用变量引用: 如果将字符串分配给一个变量(例如,so = 'so'),ID 将保持不变,因为实习字符串绑定到变量。

连接字符串

连接字符串也会影响 ID。在优化器限制内连接的字符串可能会导致中间字符串,从而导致连接字符串具有相同的 ID。

结论

Python 2.7 中不可变字符串的 ID 为由于实习机制和内存重用,并不总是相同的。了解这些因素有助于澄清字符串 ID 中明显的不一致。

以上是为什么不可变字符串 ID 在 Python 2.7 中会发生变化?的详细内容。更多信息请关注PHP中文网其他相关文章!

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