gpt4 book ai didi

以点开头的 Python 字符串未通过 ID 测试?

转载 作者:太空宇宙 更新时间:2023-11-04 00:44:03 24 4
gpt4 key购买 nike

我在 Python 2.7 中试过这个:

In [1]: s = 'abc'

In [2]: s is 'abc'
Out[2]: True


In [3]: s = '.abc'

In [4]: s is '.abc'
Out[4]: False

为什么第二个测试返回False?

最佳答案

答案是:因为 python 会尝试检测哪些字符串看起来像标识符,并自动保留它们,以便对它们进行字符串比较 O(1)。

在python解释器中,有如下函数:

#define NAME_CHARS \
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"

/* all_name_chars(s): true iff all chars in s are valid NAME_CHARS */

static int
all_name_chars(unsigned char *s)
{
static char ok_name_char[256];
static unsigned char *name_chars = (unsigned char *)NAME_CHARS;

if (ok_name_char[*name_chars] == 0) {
unsigned char *p;
for (p = name_chars; *p; p++)
ok_name_char[*p] = 1;
}
while (*s) {
if (ok_name_char[*s++] == 0)
return 0;
}
return 1;
}

它会在您代码中的所有字符串文字上调用,以检测它们是否看起来像标识符并且是否应该被保留。

程序经常使用字符串作为标识符,例如作为字典中的键,或作为某种标志。重要的是,可以通过检查对象的身份非常快速地完成此类字符串的比较。因此,python 会检测代码中的所有此类字符串,并使它们指向唯一的对象。这就是您的第一个比较返回 true 的原因。

然而,驻留字符串会占用内存,因此 python 尽量不驻留看起来像自然语言或文本的字符串。因此,如果一个字符串包含任何不是字母、数字或 _ 的字符,那么它就不会被保留。

你可以在这里找到更多相关信息:http://guilload.com/python-string-interning/

关于以点开头的 Python 字符串未通过 ID 测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40576813/

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