11 string cpython string-interning
在python 3.5中,是否可以预测何时获得实习字符串或何时获得副本?在阅读了有关此问题的一些Stack Overflow答案后,我发现这个答案最有帮助但仍然不全面.比我查看Python文档,但默认情况下不保证实习
通常,Python程序中使用的名称会自动实现,而用于保存模块,类或实例属性的字典具有实习键.
所以,我的问题是关于内部intern()条件,即决策(是否实习生字符串字面与否):为什么同样的代码工作在一个系统上,而不是在一个又一个,什么规则做了回答笔者就提到的话题平均值说的时候
何时发生这种情况的规则相当复杂
您认为有规则吗?
实习的唯一规则是实习的返回值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));
}
Run Code Online (Sandbox Code Playgroud)
这里的“规则”是,co_consts如果Python代码对象中的字符串对象仅由Python标识符中合法的ASCII字符组成,则会被屏蔽。"left"被拘禁,但"as,df"不会被"1234"拘禁,即使标识符不能以数字开头也将被拘禁。尽管标识符可以包含非ASCII字符,但此检查仍会拒绝此类字符。实际的标识符永远不会通过此代码;他们无条件地被禁闭了几行,无论是否为ASCII。该代码可能会发生更改,并且还有许多其他代码可以进行内部或类似内部的操作。
向我们索要字符串实习的“规则”,就像向气象学家询问,婚礼是否下雨有什么规则。我们可以告诉您很多有关它如何工作的信息,但是对您来说用处不大,您总是会感到惊讶。