2016-03-04 26 views
11

在python 3.5中,是否有可能预测何时会得到一个实际的字符串,或者我们何时会得到一个副本?在阅读了关于此问题的几个Stack Overflow答案之后,我发现this one最有帮助但仍不全面。比我看着Python docs,但实习默认情况下不保证cpython的字符串实习规则是什么?

通常,在Python程序中使用的名称被自动拘留,并字典用来装模块,类或实例属性已经实习键。

所以,我的问题是关于内部intern()条件,即决策(是否实习生字符串字面与否):为什么同样的代码工作在一个系统上,而不是在一个又一个,什么规则确实作者在mentioned topic的回答说

时意味着当发生这种情况的规则是相当令人费解

+0

只要使用== ==忘记它。无论如何它都是实现细节。 – wim

+3

@erip我相信OP知道这一点。在通过样板之后,这个问题似乎是在问实习规则。 – timgeb

+1

如果你真的想知道实现中的差异,指定两个系统上安装的Python版本可能是有意义的。 –

回答

3

你觉得有规则

实习内容的唯一规则是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)); 
} 

这里的“规则”是,如果纯粹由ASCII字符是一个Python标识符法律在Python代码对象的co_consts一个字符串对象被扣留。 "left"会被拦截,但"as,df"不会,并且"1234"将被拦截,即使标识符不能以数字开头。尽管标识符可以包含非ASCII字符,但此类字符仍然会被此检查拒绝。 实际的标识符永远不会通过此代码;他们无条件地实行了几行,不管是ASCII还是非ASCII。这段代码随时可能发生变化,还有很多其他代码可以实现实习或类似实习的内容。

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

+1

是的。像往常一样执行细节,** RTFS **是唯一的答案.. – wim

-3

从我从你链接的帖子理解:

当使用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 

Ç编程语言,使用字符串""将使其const char *。我认为这是发生在这里的事情。