这是关于CPython实现如何选择缓存字符串文字的古怪之处。具有相同内容的字符串文字可以引用相同的字符串对象,但不必如此。
'string'恰好在时会自动被拦截,
'string'因为并非
'string'仅包含Python标识符中允许的字符。我不知道 为什么
这是他们选择的标准,但这是事实。在不同的Python版本或实现中,行为可能有所不同。
从CPython
2.7源代码的
stringobject.h第28行:
中间字符串(ob_sstate)试图确保仅存在一个具有给定值的字符串对象,因此相等性测试可以是一个指针比较。尽管内置的intern()可用于强制对任何字符串进行中间化,但这通常仅限于“看起来像”
Python标识符的字符串。
您可以在中查看执行此 *** 作的代码
Objects/preobject.c:
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和
b赋值,例如将它们放在模块或中
ifTrue:,则将发现
a和
b相同的字符串。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)