cpython的字符串实习规则是什么?

2024-04-24 06:59:03 发布

您现在位置:Python中文网/ 问答频道 /正文

在Python3.5中,是否可以预测何时我们将获得一个内部字符串或何时我们将获得一个副本?在阅读了关于这个问题的一些堆栈溢出的答案后,我发现this one是最有用的,但仍然不够全面。比我看的Python docs要多,但是实习在默认情况下是不保证的

Normally, the names used in Python programs are automatically interned, and the dictionaries used to hold module, class or instance attributes have interned keys.

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

the rules for when this happens are quite convoluted


Tags: the字符串答案docsnames堆栈系统副本
2条回答

你认为有规则吗

interning的唯一规则是intern的返回值被internied。其他一切都取决于决定某段代码应该或不应该进行实习的人的突发奇想。例如,"left"^{}拘留:

/* 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码。此代码可能会发生更改,并且还有很多其他代码可以进行实习或类似实习的操作

问我们关于弦乐实习的“规则”就像问一位气象学家关于婚礼是否下雨的规则一样。我们可以告诉你很多关于它是如何工作的,但是它对你没有多大用处,你总是会得到惊喜

从你链接的帖子中我了解到:

当您使用if a == b时,您正在检查a的值是否是b的值,而当您使用if a is b时,您正在检查ab是否是同一对象(或共享内存中的同一位置)

现在python实习常量字符串(由“blabla”定义)。 因此:

>>> a = "abcdef"
>>> a is "abcdef"
True

但当你这样做的时候:

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

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

相关问题 更多 >