当前位置: 首页 > 知识库问答 >
问题:

字符串是否被缓存?

阳宾实
2023-03-14
>>> a = "zzzzqqqqasdfasdf1234"
>>> b = "zzzzqqqqasdfasdf1234"
>>> id(a)
4402117560
>>> id(b)
4402117560

但是

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

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

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

共有1个答案

终育
2023-03-14

它不是关于ASCII和非ASCII(你的“非ASCII”仍然是ASCII,它只是标点符号,而不是字母数字)。CPython,作为一个实现细节,实习生使用只包含“名称字符”的字符串常量。本例中的“名称字符”与正则表达式转义的意思相同:字母数字加下划线。

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

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

 类似资料:
  • 问题内容: 但 为什么仅在分配字符串时才获得相同的id()结果? 编辑:我用“字符串”代替“ ASCII字符串”。感谢您的反馈 问题答案: 这与ASCII与非ASCII无关(您的“非ASCII”仍然是ASCII,只是标点符号,而不是字母数字)。CPython作为实现细节,将仅包含“名称字符”的字符串常量进行实习。在这种情况下,“名称字符”与正则表达式转义的含义相同:字母数字加下划线。 注意:这可以

  • 问题内容: 因此,这里的问题非常简单:是否可以判断Java中是否存在Interin?我的猜测不是,但是我想知道是否有人知道更好。 问题答案: 找出a 是否被拘禁的唯一方法是调用并检查其是否返回: 显然,这有一个缺点,那就是以前没有进行过intern的时间。 部分去题外话,有办法做“定制”与使用显式泳池实习接口的番石榴(利用暴露的实现类)。这样做的好处是,当不再引用自身(因此也就是池)时,便可以对其

  • void is_cached(string template, [string cache_id]) This returns true if there is a valid cache for this template. This only works if caching is set to true. 在指定模板的缓存存在是返回真。只有在缓存设置为真时才可用。 Example 13-18

  • 问题内容: 如何检查字符串是否已经编码? 例如,如果我编码,我得到。如果我再次对最后一个字符串进行编码,我会得到,如果这样做,我必须先知道它是否已经被编码… 我已经保存了编码参数,我需要搜索它们。我不知道输入参数是什么,要编码还是不编码,所以我必须知道在搜索之前是否必须对它们进行编码或解码。 问题答案: 解码,与原始图像进行比较。如果确实不同,则对原稿进行编码。如果没有区别,则原始文件不会被编码。

  • 当使用文字创建字符串时,它会存储在池中。但当使用new运算符创建字符串对象时,它会将对象存储在堆中。 但是,堆中的对象只是一个指向存储在池中的文本的指针,还是一个存储在堆中的简单字符串对象,符合GC的条件?

  • 问题内容: 如何检查是否是那里的? 我想分配给是否有结果,否则。 我当前的代码是: 问题答案: