2016-03-04 6 views
11

python 3.5では、いつ私たちが内部文字列を取得するのか、またはコピーを取得するのかを予測することはできますか?この問題に関するいくつかのStack Overflowの回答を読んだところで、私はthis oneが最も役に立つが包括的ではないことが分かった。私は通常Python docsに見えたが、インターンはデフォルトcpythonの文字列インターンリングのルールは何ですか?

によって保証されていないよりも、Pythonプログラムで使用される名前は、自動的に抑留され、モジュール、クラス、またはインスタンスの属性を保持するために使用される辞書は抑留されていますキー。

だから、私の質問は、内側intern()条件、すなわち意思決定についてです(リテラルかインターン文字列にするかどうか):コードの同じ部分がなく別のものにし、ルールが何をしたか、著者一つのシステム上で動作する理由

といったらmentioned topicの留守この問題が発生したときのためのルールは非常に複雑であることを意味

私はあなたがリンクされ、ポストから理解するものから
+0

'=='を使って忘れてください。それはとにかく実装の詳細です。 – wim

+3

@erip私はOPがそれを認識していると信じています。ボイラープレートを通過した後、この質問はインターナショナルルールについて質問しているようです。 – timgeb

+1

実際の実装の違いを知りたい場合は、おそらく両方のシステムにインストールされているPythonのバージョンを指定するのが理にかなっています。 –

答えて

3

のルールはだと思いますか?

インターンの唯一の規則は、戻り値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)); 
} 

「ルール」はここではPythonの識別子では合法ですASCII文字で純粋に構成されている場合は、Pythonのコードオブジェクトのco_consts内の文字列オブジェクトが抑留されることをです。 "left"は中止されますが、"as,df"は存在しません。識別子は数字で始めることはできませんが、"1234"は中止されます。識別子には非ASCII文字を含めることができますが、このような文字はこのチェックでは拒否されます。 実際の識別子はこのコードを通過しません。彼らは無条件にASCIIであるかどうかにかかわらず、いくつかの行を受け入れます。このコードは変更されることがあり、インターンまたはインターンのようなものを実行する他のコードがたくさんあります。

文字列インターンングの「ルール」について私たちにお尋ねするのは、あなたの結婚式で雨が降っているかどうかについて気象学者に尋ねるようなものです。どのように動作するかはかなりわかりますが、あまり役に立ちません。常に驚きを感じます。

+1

はい。実装の詳細といつものように、** RTFS **は本当に唯一の答えです。 – wim

-3

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

、あなたは、チェックされています。

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

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

しかし、あなたは:Cプログラミング言語で

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

""で文字列を使用して、それconst char *ようになります。私はこれがここで起こっていると思います。

関連する問題