0

それでは、私たちが知っていることを見てみましょう:

  1. 演算子は、is演算子とは対照的に、値ではなく ID を比較し==ます。
  2. Python は文字列リテラルをインターンし"hello" is "hello"ますTrue

だから私が理解していないのは、この動作です:

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

どちらも文字列リテラルではありませんが、単一の文字は同一としてカウントされますが、2 文字の文字列は、同一ではないという、私が期待する結果をもたらします。

input() 関数は文字列を動的に作成しているため、結果はインターンされません。これが'hj'、動的に作成された'hj'と が同一でない理由です。しかし、なぜ'h'と dynamicが'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;
    }
    // ...
}

CPython は、配列内のすべての単一文字列をインターンしますcharacters

于 2013-10-13T23:16:02.383 に答える
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
于 2013-10-13T23:05:12.167 に答える