我了解到在一些不可变的类中,__new__
可能会返回一个现有的实例 - 这就是int
, str
and tuple
类型有时适用于小值。
但为什么以下两个片段的行为不同呢?
末尾有一个空格:
>>> a = 'string '
>>> b = 'string '
>>> a is b
False
没有空格:
>>> c = 'string'
>>> d = 'string'
>>> c is d
True
为什么空间会带来差异?
这是 CPython 实现选择缓存字符串文字的一个怪癖。具有相同内容的字符串文字可能引用相同的字符串对象,但它们不是必须的。'string'
碰巧被自动实习'string '
不是因为'string'
仅包含 Python 标识符中允许的字符。我不知道why这是他们选择的标准,但事实确实如此。在不同的 Python 版本或实现中,行为可能有所不同。
从CPython 2.7源代码来看,stringobject.h,第 28 行:
实习字符串 (ob_sstate) 尝试确保只有一个字符串
存在具有给定值的对象,因此相等性测试可以是一个指针
比较。这通常仅限于“看起来像”的字符串
Python 标识符,尽管可以使用内置 intern() 强制
任何字符串的实习。
您可以在中看到执行此操作的代码Objects/codeobject.c:
/* Intern selected string constants */
for (i = PyTuple_Size(consts); --i >= 0; ) {
PyObject *v = PyTuple_GetItem(consts, i);
if (!PyString_Check(v))
continue;
if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
continue;
PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
}
另请注意,驻留是与 Python 字节码编译器合并字符串文字不同的过程。如果你让编译器编译a
and b
一起作业,例如通过将它们放置在模块或if True:
,你会发现a
and b
将是相同的字符串。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)