>>> 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
的含义相同:字母数字加下划线。
注意:这可以随时更改,永远不要依赖,这只是他们碰巧使用的优化。
据推测,做出此选择是为了优化使用 getattr
和 setattr
的代码,dict
由少量字符串文字键入等,其中实习意味着所涉及的字典查找通常最终会进行指针比较并完全避免比较字符串(当两个字符串都被实习时,它们在定义上要么是同一个对象,要么不相等,因此您可以避免阅读他们的数据完全)。