cpython的字符串实习有哪些规则?

时间:2016-03-04 20:50:00

标签: string cpython string-interning

在python 3.5中,是否可以预测何时获得实习字符串或何时获得副本?在阅读了一些关于此问题的Stack Overflow答案之后,我发现this one最有帮助但仍然不全面。比我查看Python docs,但默认情况下不保证实习

  

通常 ,Python程序中使用的名称会自动实现,用于保存模块,类或实例属性的字典具有实习键。

所以,我的问题是关于内部intern()条件,即决策(是否实习字符串文字):为什么同一段代码在一个系统上工作而不在另一个系统上工作,以及做了什么规则mentioned topic答案的作者在说

时的意思
  

发生这种情况的规则非常复杂

2 个答案:

答案 0 :(得分:5)

您认为有规则

实习的唯一规则是intern的返回值被实习。其他任何事情都取决于谁决定某些代码应该或不应该实习的人。例如,"left"PyCodeNew实习:

/* Intern selected string constants */
for (i = PyTuple_GET_SIZE(consts); --i >= 0; ) {
    PyObject *v = PyTuple_GetItem(consts, i);
    if (!all_name_chars(v))
        continue;
    PyUnicode_InternInPlace(&PyTuple_GET_ITEM(consts, i));
}

这里的“规则”是Python代码对象的co_consts中的字符串对象如果纯粹由Python标识符中合法的ASCII字符组成,则会被实现。 "left"被拦截,但"as,df"不会被拦截,即使标识符不能以数字开头,"1234"也会被拦截。虽然标识符可以包含非ASCII字符,但此检查仍会拒绝此类字符。 实际标识符不会通过此代码;他们无条件地加入几行,ASCII或不。这段代码可能会发生变化,而且还有很多其他代码可以执行实习或实习。

向我们询问字符串实习的“规则”就像问气象学家对你的婚礼是否下雨有什么规则。我们可以告诉你很多关于它是如何工作的,但它对你没什么用处,你总会得到惊喜。

答案 1 :(得分:-3)

根据我对您链接的帖子的理解:

当您使用if a == b时,您正在检查a的值是否为b的值,而当您使用if a is b时,您正在检查a是否b 1}}和>>> a = "abcdef" >>> a is "abcdef" True 是同一个对象(或共享内存中的相同位置)。

现在python实例化常量字符串(由“blabla”定义)。 所以:

>>> a = "".join([chr(i) for i in range(ord('a'), ord('g'))])
>>> a
'abcdef'
>>> a is "abcdef"
False

但是当你这样做时:

""

C 编程语言中,使用带有const char *的字符串会使其成为{{1}}。我想这就是这里发生的事情。