是否缓存了字符串?

时间:2017-03-09 01:21:34

标签: python string

>>> a = "zzzzqqqqasdfasdf1234"
>>> b = "zzzzqqqqasdfasdf1234"
>>> id(a)
4402117560
>>> id(b)
4402117560

>>> c = "!@#$"
>>> d = "!@#$"
>>> id(c) == id(d)
False
>>> id(a) == id(b)
True

为什么只在分配字符串时得到相同的id()结果?

编辑:我用“string”替换“ascii string”。感谢您的反馈

1 个答案:

答案 0 :(得分:6)

这不是关于ASCII与非ASCII(你的“非ASCII”仍然是ASCII,它只是标点符号,而不是字母数字)。 CPython,作为实现细节,interns string constants that contain only "name characters"。在这种情况下,“名称字符”表示与正则表达式转义符\w相同:字母数字,加上下划线。

注意:这可以随时更改,永远不应该依赖,这只是他们碰巧使用的优化。

猜测一下,这个选择是为了优化使用getattrsetattrdict由一些字符串文字键入的代码等,其中interning意味着所涉及的字典查找通常最终会进行指针比较并避免比较字符串(当两个字符串都被中断时,它们在定义上是相同的对象,或者不相等,因此您可以避免完全读取它们的数据。)