带有空格且末尾无空格且不可变的Python字符串

带有空格且末尾无空格且不可变的Python字符串,第1张

带有空格且末尾无空格且不可变的Python字符串

这是关于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
相同的字符串。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5587683.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-14

发表评论

登录后才能评论

评论列表(0条)

保存