12

在 python 3.5 中,是否可以预测我们何时会得到一个实习字符串或何时会得到一个副本?在阅读了有关此问题的一些 Stack Overflow 答案后,我发现是最有帮助但仍不全面的一个。比我查看的Python 文档还要多,但默认情况下不保证实习

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

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

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

4

2 回答 2

7

你认为有规则吗?

实习的唯一规则是 的返回值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));
}

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

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

于 2016-03-04T22:03:21.020 回答
-4

根据我从您链接的帖子中了解到的情况:

使用 时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编程语言中,使用字符串 with""将使其成为const char *. 我认为这就是这里正在发生的事情。

于 2016-03-04T21:16:04.610 回答