Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String cpython'的规则是什么;什么是实习?_String_Cpython_String Interning - Fatal编程技术网

String cpython'的规则是什么;什么是实习?

String cpython'的规则是什么;什么是实习?,string,cpython,string-interning,String,Cpython,String Interning,在Python3.5中,是否可以预测何时我们将获得一个内部字符串或何时我们将获得一个副本?在阅读了关于这个问题的一些堆栈溢出的答案后,我发现其中最有帮助但仍然不够全面。比我看到的要多,但是实习在默认情况下是不能保证的 通常,Python程序中使用的名称会自动插入,用于保存模块、类或实例属性的字典具有插入键 因此,我的问题是关于内部intern()条件,即决策(是否对字符串文本进行intern):为什么同一段代码在一个系统上工作,而不是在另一个系统上工作,以及答案的作者在说 发生这种情况的规则相当

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

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

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

发生这种情况的规则相当复杂


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

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

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

但当你这样做的时候:

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

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

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

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

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

但当你这样做的时候:

>>> a = "".join([chr(i) for i in range(ord('a'), ord('g'))])
>>> a
'abcdef'
>>> a is "abcdef"
False
在C编程语言中,使用带有
的字符串将使其成为
常量字符*
。我想这就是这里发生的事情。

你认为有规则吗

实习的唯一规则是,
intern
的返回值被实习。其他一切都取决于决定某段代码应该或不应该进行实习的人的突发奇想。例如,
“left”
通过以下方式实习:

这里的“规则”是,如果Python代码对象的
co_consts
中的字符串对象纯粹由在Python标识符中合法的ASCII字符组成,则该字符串对象将被扣留<代码>“left”将被拘留,但
“as,df”
将不会被拘留,
“1234”
将被拘留,即使标识符不能以数字开头。虽然标识符可以包含非ASCII字符,但此检查仍会拒绝此类字符。实际标识符永远不会通过此代码;他们被无条件拘留了几行,不管有没有ASCII码。此代码可能会发生更改,并且还有很多其他代码可以进行实习或类似实习的操作

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

你认为有规则吗

实习的唯一规则是,
intern
的返回值被实习。其他一切都取决于决定某段代码应该或不应该进行实习的人的突发奇想。例如,
“left”
通过以下方式实习:

这里的“规则”是,如果Python代码对象的
co_consts
中的字符串对象纯粹由在Python标识符中合法的ASCII字符组成,则该字符串对象将被扣留<代码>“left”将被拘留,但
“as,df”
将不会被拘留,
“1234”
将被拘留,即使标识符不能以数字开头。虽然标识符可以包含非ASCII字符,但此检查仍会拒绝此类字符。实际标识符永远不会通过此代码;他们被无条件拘留了几行,不管有没有ASCII码。此代码可能会发生更改,并且还有很多其他代码可以进行实习或类似实习的操作


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

@erip我相信OP知道这一点。看完样板后,这个问题似乎是在问实习规则。如果您真的想知道实现上的差异,那么指定两个系统上安装的Python版本可能是有意义的。@wim我不想忘记,我想学习和理解。@wim我很乐意,但是我对Python的经验不是很高,所以欢迎您自己编辑这个问题,因为您看到了唯一的规则是
intern
的返回值是interned。其他一切都是实施细节的泥沼,不一致,因为保持一致没有什么意义。@erip我相信OP知道这一点。看完样板后,这个问题似乎是在问实习规则。如果您真的想知道实现上的差异,那么指定两个系统上安装的Python版本可能是有意义的。@wim我不想忘记,我想学习和理解。@wim我很乐意,但是我对Python的经验不是很高,所以欢迎您自己编辑这个问题,因为您看到了唯一的规则是
intern
的返回值是interned。其他一切都是实施细节的泥沼,不一致,因为保持一致没有什么意义。
/* 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));
}