所以,让我们来看看我们所知道的:
is
运算符相比,==
运算符会比较身份而不是值。"hello" is "hello"
为True
。所以我不明白这种行为:
>>>'h' is input()
h
True
>>>'hj' is input()
hj
False
单个字符被视为相同,即使它们不是两个字符串文字,而一个双字符串字符串给出了我期望的结果,不相同。
由于input()函数正在动态创建字符串,因此结果未被实现,这就是'hj'
和动态创建的'hj'
不相同的原因。但为什么'h'
和动态'h'
相同?
这是否意味着Python缓存/实习所有长度为1的字符串?
答案 0 :(得分:6)
PyObject *
PyString_FromStringAndSize(const char *str, Py_ssize_t size)
{
// ...
if (size == 1 && str != NULL &&
(op = characters[*str & UCHAR_MAX]) != NULL)
{
Py_INCREF(op);
return (PyObject *)op;
}
// ...
}
CPython实习characters
数组中的所有单个字符串。
答案 1 :(得分:1)
identical
与equal
不同。 identical
表示他们拥有相同的内存地址(因此当然禁止废话__eq__
或__cmp__
他们也必须相等)
Python语言没有指定字符串应该或不应该占用相同的内存地址。由于字符串是不可变的,因此实现可以选择将它们“实际”作为优化
以pypy为例
Python 2.7.2 (1.9+dfsg-1, Jun 19 2012, 23:23:45)
[PyPy 1.9.0 with GCC 4.7.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
And now for something completely different: ``<fijal> I love pypy''
>>>> 'h' is raw_input()
h
False