【问题标题】:What determines which strings are interned and when? [duplicate]什么决定了哪些字符串在什么时候被保留? [复制]
【发布时间】:2012-05-16 16:11:30
【问题描述】:
>>> s1 = "spam"
>>> s2 = "spam"
>>> s1 is s2
True
>>> q = 'asdalksdjfla;ksdjf;laksdjfals;kdfjasl;fjasdf'
>>> r = 'asdalksdjfla;ksdjf;laksdjfals;kdfjasl;fjasdf'
>>> q is r
False

s1 is s2False 应该有多少个字符?极限在哪里?即我在问一个字符串在 python 开始制作它的单独副本之前需要多长时间。

【问题讨论】:

  • 你是在问一个字符串需要多长时间才能开始复制它?
  • 它完全依赖于实现,并且可以在 Python 的下一版本中更改而不会发出警告。你为什么想知道?
  • 是的,我在问一个字符串在 python 开始制作它的单独副本之前需要多长时间。
  • 我只是想知道就知道。不知道这个不重要,很灵活。
  • 如果我只进行测试,我永远不会知道这是依赖于实现的

标签: python string-interning


【解决方案1】:

字符串实习是特定于实现的,不应依赖,如果您想检查两个字符串是否相同,请使用相等测试。

【讨论】:

  • ...具体实现。这也是答案。谢谢。
  • @Cris 作为一个具体的例子,ideone's python version seems to intern your "long" strings 以及 1000-character-eval-constructed strings。
  • 它给了我更多的知识和更多的问题,没关系。
  • 那么就没有一个合法的用例供用户测试s1 is s2 吗?
【解决方案2】:

如果你想,出于某种奇怪的原因,强制比较为真,那么使用 intern 函数:

>>> a = 实习生('12345678012345678901234567890qazwsxedcrfvtgbyhnujmikolp') >>> b = 实习生('12345678012345678901234567890qazwsxedcrfvtgbyhnujmikolp') >>> a 是 b 真的

【讨论】:

  • 出于某种奇怪的原因,很高兴知道。
  • 此外,intern 与 id 一起被移到 python 3000 中的模块 sys 中。也很高兴知道。
  • 由于某些原因,最多。你能说intern()只有python 3000玩具吗?
  • @Cris intern() 至少从 1.5 版开始就在 Python 中
  • 实习生在根命名空间中。
【解决方案3】:

这是一条关于 CPython 2.5.0 源文件 (stringobject.h) 中的实习字符串的评论

/* ... ... This is generally restricted to strings that **"look like" Python identifiers**, although the intern() builtin can be used to force interning of any string ... ... */

因此,只包含下划线、数字或字母的字符串将被保留。在您的示例中,q 和 ``r 包含 ;,因此它们不会被拘留。

【讨论】:

    猜你喜欢
    • 2011-03-27
    • 2020-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多