0

那么,让我们来看看我们所知道的:

  1. is运算符比较身份,而不是值,而不是==
  2. Python 实习生字符串文字"hello" is "hello"True.

所以我不明白的是这种行为:

>>>'h' is input()
 h
True
>>>'hj' is input()
hj
False

单个字符被视为相同,即使它们不是两个字符串文字,而双字符字符串给了我我期望的结果,即不相同的结果。

由于 input() 函数正在动态创建字符串,因此结果没有被实习,这就是为什么'hj'和动态创建'hj'的不完全相同的原因。但是为什么都是'h'和动态的'h'相同呢?

这是否意味着 Python 缓存/实习所有长度为 1 的字符串?

4

2 回答 2

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;
    }
    // ...
}

charactersCPython 实习生数组中的所有单个字符串。

于 2013-10-13T23:16:02.383 回答
1

identical与 不同equalidentical意味着它们具有相同的内存地址(当然,除非废话__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
于 2013-10-13T23:05:12.167 回答