web-dev-qa-db-ja.com

Python:(「hello」は「hello」です)がTrueと評価されるのはなぜですか?

どして "hello" is "hello" PythonでTrueを生成しますか?

私は以下を読みます ここ

2つの文字列リテラルが等しい場合、それらは同じメモリ位置に配置されています。文字列は不変のエンティティです。害はありません。

したがって、Python=文字列ごとに、メモリ内の場所は1つだけです。かなり奇妙に聞こえます。ここで何が起こっているのですか?

55
Deniz Dogan

Python(Java、C、C++ 、. NETなど)は、文字列プーリング/インターニングを使用します。インタプリタは、「hello」が「hello」と同じであることを認識するため、メモリ内の同じ場所を最適化して使用します。

もう1つの利点:"hell" + "o" is "hello" ==> True

86
carl

したがって、Python文字列ごとに、メモリ内の場所は1つだけですか?

いいえ、インタープリターが最適化することを決定したもののみです。これは、言語仕様の一部ではなく、異なるCPythonバージョンで変更される可能性があるポリシーに基づく決定です。

例えば。インストール時(2.6.2 Linux):

>>> 'X'*10 is 'X'*10
True
>>> 'X'*30 is 'X'*30
False

同様にintの場合:

>>> 2**8 is 2**8
True
>>> 2**9 is 2**9
False

したがって、 'string'は 'string'に依存しないでください。Cの実装を見ただけでは安全ではありません。

61
bobince

リテラル文字列は、おそらくハッシュまたは類似したものに基づいてグループ化されます。 2つの同じリテラル文字列が同じメモリに格納され、参照は両方ともそれを参照します。

 Memory        Code
-------
|          myLine = "hello"
|        /
|hello  <
|        \
|          myLine = "hello"
-------
13
Quantumplation

is演算子は、両方の引数が同じオブジェクトである場合にtrueを返します。あなたの結果はこれの結果であり、引用されたビットです。

文字列リテラルの場合、これらはインターンされます。つまり、既知の文字列と比較されます。同一の文字列がすでにわかっている場合、リテラルは代替値ではなくその値を取ります。したがって、それらは同じオブジェクトになり、式は真になります。

Pythonインタプリタ/コンパイラは、文字列リテラル、つまり引用符で囲まれた文字のリストを解析します。これを行うと、「以前にこの文字列を見たことがある」ことを検出し、次と同じ表現を使用できます。このように定義された文字列は変更できないことがわかっているため、これを行うことができます。

2
unwind

なぜそれが奇妙なのですか。文字列が不変である場合、それを1回だけ格納することは非常に理にかなっています。 .NETも同じ動作です。

1
Brian Rasmussen

2つの変数(文字列だけでなく)に同じ値が含まれている場合、値は2回ではなく1回だけ格納され、両方の変数が同じ場所を指すと思います。これはメモリを節約します。

0
user250145