なぜPythonで"hello" is "hello"
生成するのですか?True
私はここで以下を読みました:
2つの文字列リテラルが等しい場合、それらは同じメモリ位置に配置されています。文字列は不変のエンティティです。害はありません。
では、Python文字列ごとにメモリ内に1つの場所しかありませんか?かなり奇妙に聞こえます。何が起きてる?
なぜPythonで"hello" is "hello"
生成するのですか?True
私はここで以下を読みました:
2つの文字列リテラルが等しい場合、それらは同じメモリ位置に配置されています。文字列は不変のエンティティです。害はありません。
では、Python文字列ごとにメモリ内に1つの場所しかありませんか?かなり奇妙に聞こえます。何が起きてる?
Python(Java、C、C ++、.NETなど)は文字列プーリング/インターンを使用します。インタプリタは、「hello」が「hello」と同じであることを認識しているため、メモリ内の同じ場所を最適化して使用します。
別の良い点:"hell" + "o" is "hello"
==>True
では、Python文字列ごとにメモリ内に1つの場所しかありませんか?
いいえ、通訳者が最適化することを決定したのは1つだけです。これは、言語仕様の一部ではなく、異なるCPythonバージョンで変更される可能性のあるポリシーに基づく決定です。
例えば。私のインストール(2.6.2 Linux):
>>> 'X'*10 is 'X'*10
True
>>> 'X'*30 is 'X'*30
False
intsについても同様です。
>>> 2**8 is 2**8
True
>>> 2**9 is 2**9
False
したがって、「文字列」が「文字列」であることに依存しないでください。Cの実装を見ただけでも、安全ではありません。
リテラル文字列は、おそらくハッシュなどに基づいてグループ化されます。同じリテラル文字列のうちの2つは同じメモリに格納され、すべての参照は両方ともそれを参照します。
Memory Code
-------
| myLine = "hello"
| /
|hello <
| \
| myLine = "hello"
-------
両方のis
引数が同じオブジェクトの場合、演算子はtrueを返します。あなたの結果はこれと引用されたビットの結果です。
文字列リテラルの場合、これらはインターンされます。つまり、既知の文字列と比較されます。同一の文字列がすでにわかっている場合、リテラルは代替の値ではなく、その値を取ります。したがって、それらは同じオブジェクトになり、式は真になります。
Pythonインタープリター/コンパイラーは、文字列リテラル、つまり引用符で囲まれた文字のリストを解析します。これを行うと、「この文字列を見たことがあります」を検出し、前回と同じ表現を使用できます。このように定義された文字列は変更できないことがわかっているため、これを行うことができます。
なぜそれは奇妙なのですか。文字列が不変である場合は、一度だけ保存するのが理にかなっています。.NETの動作は同じです。
2つの変数(文字列だけでなく)に同じ値が含まれている場合、値は2回ではなく、1回だけ格納され、両方の変数が同じ場所を指すと思います。これにより、メモリが節約されます。