gpt4 book ai didi

python - CPython 中的字符串标识比较

转载 作者:太空狗 更新时间:2023-10-30 01:55:54 28 4
gpt4 key购买 nike

我最近在生产系统中发现了一个潜在的错误,其中两个字符串使用身份运算符进行比较,例如:

if val[2] is not 's':

我想这无论如何都会经常起作用,因为据我所知,CPython 将短的不可变字符串存储在同一位置。我已经用 != 替换了它,但是我需要确认之前通过这段代码的数据是正确的,所以我想知道这是否总是有效,或者是否只是有时成功了。

据我所知,Python 版本一直是 2.6.6,上面的代码似乎是唯一使用 is 运算符的地方。

有谁知道这条线是否总是像程序员预期的那样工作?

编辑:因为这无疑是非常具体的并且对 future 的读者没有帮助,所以我会问一个不同的问题:

我应该在哪里查看以绝对确定地确认 Python 实现的行为? CPython 源代码中的优化是否易于理解?有什么建议吗?

最佳答案

您可以查看 2.6.x 的 CPython 代码:http://svn.python.org/projects/python/branches/release26-maint/Objects/stringobject.c

看起来单字符字符串被特殊处理,每个不同的字符串只存在一次,因此您的代码是安全的。这是一些关键代码(摘录):

static PyStringObject *characters[UCHAR_MAX + 1];

PyObject *
PyString_FromStringAndSize(const char *str, Py_ssize_t size)
{
register PyStringObject *op;
if (size == 1 && str != NULL &&
(op = characters[*str & UCHAR_MAX]) != NULL)
{
Py_INCREF(op);
return (PyObject *)op;
}

...

关于python - CPython 中的字符串标识比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4853524/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com