是否缓存了字符串?

doh*_*vis 4 python string

>>> a = "zzzzqqqqasdfasdf1234"
>>> b = "zzzzqqqqasdfasdf1234"
>>> id(a)
4402117560
>>> id(b)
4402117560
Run Code Online (Sandbox Code Playgroud)

>>> c = "!@#$"
>>> d = "!@#$"
>>> id(c) == id(d)
False
>>> id(a) == id(b)
True
Run Code Online (Sandbox Code Playgroud)

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

编辑:我用"字符串"替换"ascii字符串".感谢您的反馈

Sha*_*ger 7

它不是关于ASCII与非ASCII(你的"非ASCII"仍然是ASCII,它只是标点符号,而不是字母数字).CPython作为一个实现细节,实例化只包含"名字字符"的字符串常量.在这种情况下,"名称字符"表示与正则表达式转义相同\w:字母数字,加上下划线.

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

在猜测,这样的选择是为了优化使用代码getattrsetattr,dictS按少数字符串文字等,其中实习意味着参与往往是字典查找结束了做指针比较,避免在比较所有字符串(键入时两个字符串都是实体,它们在定义上是相同的对象,或者不相等,所以你可以避免完全读取它们的数据).

  • @ner0:简短版本:内部字符串是全局查找表中的字符串,保证每个值的唯一标识。因此,虽然两个非驻留字符串可能具有相同的值,但却是完全不同的对象,但如果两个字符串都被驻留,则不会发生这种情况,这意味着可以通过简单的指针比较来比较两个驻留字符串是否相等,而不是比较长度,然后一一检查字符。Python 会实习每个类、属性、变量(尽管通常不用于本地作用域)、函数等的名称,因为指针会检查速度查找。 (2认同)