2017-01-26 7 views
2

もし私が間違っていないのであれば、はTrueを返してください。abは同じオブジェクトを指しています。 2つの等しいリストの場合、リストは2つの異なるリストであるため、Falseを返します。私は不変オブジェクトは、この問題を持っていなかったと思ったが、私は中に入れたとき:インターナショナルはどのように不変オブジェクトで動作しますか?

a = (1, 2, 3) 
b = (1, 2, 3) 
a is b #returns false 

私はこれが同じ値を持つ不変オブジェクトにa以来Truebポイントを返さなければならないと思いました。なぜ私はタプルを使用するとは、bと同じオブジェクトを指していないのですか?

+4

すべての変更不能オブジェクトがインターナショナルであるわけではありません。 –

+0

http://pythontutor.com/visualize.html#code=a%20%3D%20(1,%202,%203%29%0Ab%20%3D%20(1,%202,%203%29) & curInstr = 3&heapPrimitives = true&mode = display&origin = opt-frontend。%0Aa%20is%20b%20%23returns%20false&cumulative = true&curInstr = 3&heapPrimitives = true&mode =js&py = 3&rawInputLstJSON =%5B%5D&textReferences = false –

+1

これは関連しています:http://stackoverflow.com/q/6934202/4996248 –

答えて

4

あなたのaとbはではありません。は同じオブジェクトを指します(2つの個別のタプルを作成します)。 id(a)で、または - a is bでそれを調べることができます。他方、Trueである。

a == b 

一方、Trueである。

あなたがそれらが同じオブジェクトを指すようにしたい場合は、今すぐa is b

a = b = (1, 2, 3) 

を行うことができTrueです。

これは、可変性または不変性とは関係ありません。 tupleの代わりにlistを使用した場合も同様です。

あなたのコードpythontutorを視覚化して何が起こっているかを見ることができます。

Pythonはいくつかの文字列といくつかの小さな整数(例えば、a=0; b=0; a is bの結果はTrue)をインターンしますが、すべてのimmutablesが内部であるわけではありません。さらに、それに頼るべきではなく、むしろ実装の詳細と考えるべきです。

0

あなたのコードは、取得する内容と使用できないことの詳細に依存するべきではありません。これは完全に実装に依存し、ポイントリリースからポイントリリースに変更される可能性があります。

インターンは、メモリ使用量を減らすための最適化として設計されており、原則として不変の値の任意のリテラルを格納することができますが、これは実際にはほとんど起こりません。

タプルが保留されていない理由の1つは、それらが深く不変ではないということです。それらの中に何か変更可能なもの(例えば({}, []))を入れておくと、それらをインターンさせると不正な動作につながる可能性があります。

タプルには不変オブジェクトのみが含まれているかどうかをチェックできますが、タプルは任意に深くネストすることができるため、タプルには(不変の)オブジェクトが含まれていることを確認する作業が必要です必要な場合は、いつでも "手動でインターン"することができます。

a = 1, 2, 3 
b = a 
関連する問題