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

未被dict引用的字符串?

长孙章横
2023-03-14
from gc import get_referrers as refs
x = 'x'
d = {x:x}
print(d in refs(x))

如果d是任何其他容器(set、list、tuple...)包含x,则输出true。只有在dict中,它才会打印false。此外,x是键还是值,或者像上面一样,两者都是,这并不重要。

我认为在Python中,每个对象都是引用(与Java不同,Java有基元类型,而Ruby有值类型小int),但现在看来,str和int是一些基元类型,没有被引用。但另一方面,为什么只在小纸条上??

我还知道从-5到256的ints缓存在CPython中(可以存储小字符串),所以不对它们进行重新计数是有意义的,因为它们无论如何都不会被删除,但这适用于我尝试过的任何整数(和长字符串),比这个范围大得多。

越来越好奇...似乎datetime.{datetime,date,time}类具有相同的“未引用”行为。现在,我知道Thom、AnyStr和Number有一个共同点:它们的哈希值是随机的,每个会话都有一个salt。但这没有任何意义,因为即使这些只是dicts中的值,而不是键,也可以观察到这种行为。并且值不是散列的。还是他们?

共有1个答案

司马自明
2023-03-14

来自gcmodule.c:

某些类型的容器不能参与引用周期,因此不需要由垃圾收集器跟踪。取消跟踪这些对象可以降低垃圾收集的成本。但是,确定哪些对象可能未被跟踪并不是免费的,必须将成本与垃圾收集的好处进行权衡。

...

 类似资料:
  • 问题内容: 我对Python中的JSON感到有些困惑。在我看来,这就像是一本字典,出于这个原因,我正在尝试这样做: 但是当我这样做时,它会给出一个错误。 如何将该字符串转换为结构,然后调用以获得“示例词汇表”? 问题答案:

  • 我正在尝试系统地确定本地数据库和由其他人管理的远程数据库之间的模式差异。我让远程管理员运行了一个脚本,该脚本sp_help并在各种对象上sp_helptext。 有一个区别我不知道如何解释。在我的本地系统上,sp_help一个表上生成一行消息输出 没有具有架构绑定引用表“dbo.tbl”的视图。 在远程系统上,输出是“表被视图引用”,后跟一个空行。该查询是以文本形式输出的,因此这表明在远程机器上产

  • 我试图连接两个字符串,一个字符串有一些值,另一个字符串有空。 示例: 并用concat函数和运算符连接这两个字符串 示例: 根据我的理解,当在concat函数中使用空字符串时,因为string2是空的,所以不会创建新的引用。但在使用运算符时,将在字符串池常量中创建一个新引用。但在下面的代码中,当使用运算符时,不会创建新的引用。 输出: 字符串1:69066349 类别:69066349 相同的 第

  • 我在解析antlr4中的格式行列表时遇到了一个问题 但这是失败的第一个字符识别'*'本身,这使我困惑。 第1行:0不匹配的输入'*这是一个字符串',应为'*'

  • 我正在使用Postgresql数据库。我在文本中使用“时出错”, 未终止的引号字符串在或接近 "'\'')" 这是我的函数调用: 如何将这些字符插入数据库而不出现任何问题??

  • 我有一个简单的字符串,它有一个值。这个值来自生物识别提取器 我使用此代码消除多余字符: 但它只删除了~ DeviceName= 当我var_dump时,它有一个6字符串值,但它应该是5字符串值。 谢谢你的回答。下面的代码解决了我的问题。