为什么Python将单字符串字符串视为相同?

时间:2013-10-13 23:03:40

标签: python python-3.x comparison identity

所以,让我们来看看我们所知道的:

  1. is运算符相比,==运算符会比较身份而不是值。
  2. Python实习字符串文字,因此"hello" is "hello"True
  3. 所以我不明白这种行为:

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

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

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

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

2 个答案:

答案 0 :(得分:6)

From the source code

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)

identicalequal不同。 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