在python 3.5中,是否可以预测何时获得实习字符串或何时获得副本?在阅读了一些关于此问题的Stack Overflow答案之后,我发现this one最有帮助但仍然不全面。比我查看Python docs,但默认情况下不保证实习
通常 ,Python程序中使用的名称会自动实现,用于保存模块,类或实例属性的字典具有实习键。
所以,我的问题是关于内部intern()
条件,即决策(是否实习字符串文字):为什么同一段代码在一个系统上工作而不在另一个系统上工作,以及做了什么规则mentioned topic答案的作者在说
发生这种情况的规则非常复杂
答案 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}}。我想这就是这里发生的事情。