python - 字符串是否被缓存?

标签 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() 结果?

已编辑:我将“ascii 字符串”替换为“字符串”。感谢反馈

最佳答案

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

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

据推测,做出此选择是为了优化使用 getattrsetattr 的代码,dict 由少量字符串文字键入等,其中实习意味着所涉及的字典查找通常最终会进行指针比较并完全避免比较字符串(当两个字符串都被实习时,它们在定义上要么是同一个对象,要么不相等,因此您可以避免阅读他们的数据完全)。

关于python - 字符串是否被缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42684966/

相关文章:

python - CCP Stackless 演示文稿中的蓝色是什么?

string - Matlab,查找单元格元素

c++ - 如何在 C++ 中通过函数名 (std::string) 调用函数?

Python:确定固定长度列的通用算法

python - 无法添加或更新子行: a foreign key constraint fails on a Django generated MySQL table

python - 在数组中查找不寻常的值,列表

python - py2exe寻找VC9.0

c# - 有人可以帮我将多个字符串数组分配给一个二维字符串数组吗?

c - 定义字符串数组

ios - 通过 XCode 中的 dateFromString String Date 和 NSDate 不匹配