12

Python 3.5 では、いつインターンされた文字列を取得するか、またはいつコピーを取得するかを予測できますか? この問題に関するいくつかのスタック オーバーフローの回答を読んだ後、これが最も役立つが、まだ包括的ではないことがわかりましPython docsを見たよりも、インターンはデフォルトでは保証されていません

通常、Python プログラムで使用される名前は自動的にインターンされ、モジュール、クラス、またはインスタンスの属性を保持するために使用される辞書にはインターンされたキーがあります。

したがって、私の質問は、内部intern()条件、つまり意思決定 (文字列リテラルをインターンするかどうか) に関するものです。なぜ同じコード片があるシステムでは機能し、別のシステムでは機能しないのか、また、言及されたトピックに関する回答の作成者が意味するルールは何ですか?言うとき

これがいつ起こるかについてのルールは非常に複雑です

4

2 に答える 2

7

ルールがあると思いますか?

インターンの唯一のルールは、戻り値internがインターンされることです。他のすべては、コードの一部がインターンを行うべきかどうかを決定した人の気まぐれ次第です。たとえば、次のよう"left"にインターンされPyCodeNewます。

/* Intern selected string constants */
for (i = PyTuple_GET_SIZE(consts); --i >= 0; ) {
    PyObject *v = PyTuple_GetItem(consts, i);
    if (!all_name_chars(v))
        continue;
    PyUnicode_InternInPlace(&PyTuple_GET_ITEM(consts, i));
}

ここでの「規則」はco_consts、Python 識別子で正当な ASCII 文字のみで構成されている場合、Python コード オブジェクトの文字列オブジェクトがインターンされることです。"left"インターンされ"as,df"ますが、"1234"インターンされることはなく、識別子を数字で始めることはできませんが、インターンされる可能性があります。識別子には非 ASCII 文字を含めることができますが、そのような文字はこのチェックでは拒否されます。実際の識別子がこのコードを通過することはありません。ASCII であろうとなかろうと、無条件に数行上に抑留されます。このコードは変更される可能性があり、インターンまたはインターンのようなことを行うコードは他にもたくさんあります。

ストリングインターンの「ルール」を私たちに尋ねることは、結婚式に雨が降るかどうかのルールを気象学者に尋ねるようなものです. それがどのように機能するかについてはかなり多くのことを伝えることができますが、それはあなたにとってあまり役に立たないでしょうし、あなたはいつも驚きを感じるでしょう.

于 2016-03-04T22:03:21.020 に答える
-4

あなたがリンクした投稿から私が理解したことから:

を使用if a == bする場合は、 の値aが の値であるかどうかをチェックしますが、bを使用する場合は、とが同じオブジェクトであるかどうか (またはメモリ内の同じ場所を共有して if a is bいるかどうか) をチェックします。ab

これで、python は定数文字列 ( "blabla"で定義) をインターンします。そう:

>>> a = "abcdef"
>>> a is "abcdef"
True

しかし、あなたがするとき:

>>> a = "".join([chr(i) for i in range(ord('a'), ord('g'))])
>>> a
'abcdef'
>>> a is "abcdef"
False

Cプログラミング言語では、文字列を使用する""const char *. これがここで起こっていることだと思います。

于 2016-03-04T21:16:04.610 に答える