私の知る限り、Python ではすべてがオブジェクトであり、id()はオブジェクトごとに異なる数値を返す必要があります (私は正しいですか?)。
私の場合、 return 、id(1)
returnsですが、すべての浮動小数点型、 return 、 return などで同じ値を取得します。4298178968
id(2)
4298178944
id(1.1)
4298189032
id(2.2)
4298189032
すべての float 値に対して同じIDを取得するのはなぜですか?
私の知る限り、Python ではすべてがオブジェクトであり、id()はオブジェクトごとに異なる数値を返す必要があります (私は正しいですか?)。
私の場合、 return 、id(1)
returnsですが、すべての浮動小数点型、 return 、 return などで同じ値を取得します。4298178968
id(2)
4298178944
id(1.1)
4298189032
id(2.2)
4298189032
すべての float 値に対して同じIDを取得するのはなぜですか?
Python はメモリ位置を再利用できます。
実行すると:
id(1.1)
float 値を作成し、その を要求すると、何も参照されていないためid()
、Pythonは再び値を削除します。次に別のfloat 値を作成すると、Python は同じメモリ位置を再利用できるid(2.2)
ため、 に対して同じ値を返す可能性がありますid()
。
>>> id(1.1)
140550721129024
>>> id(2.2)
140550721129024
代わりにこれを行います:
float_one, float_two = 1.1, 2.2
print id(float_one), id(float_two)
これで、float 値はそれら (2 つの変数) への参照を持ち、破棄されなくなり、異なるメモリ位置とid()
値を持つようになりました。
id()
小さな整数 (-5 から 256 まで) に異なる値が表示される理由は、これらの値がインターンされているためです。Python は整数オブジェクトを1 つ 1
だけ作成し、それを何度も再利用します。その結果、Python インタープリター自体が既にそれらを参照しており、インタープリターが終了するまでそれらを削除しないため、これらの整数はすべて一意のメモリ アドレスを持ちます。
>>> id(1.1)
154154684
1.1 はどの変数にも割り当てられていないため、ガベージ コレクションが行われ、次回は同じ ID がフロートに使用されます。
>>> id(2.2)
154154684
変数に 1.1 を保存します。
>>> f = 1.1
>>> id(f)
154154684 #this id is locked for now
新しいアドレスが使用されるようになりました:
>>> id(1.1)
154154700
>>> id(2.2)
154154700
これは整数にも適用されます。
>>> id(260)
154302180
>>> id(280)
154302180
-5
からまでの整数は256
、実際には Python でキャッシュされるため、常に異なる ID を返します。( 「is」演算子は整数で予期しない動作をします)
文字列の場合:
整数と同様に、一部の文字列も Python にキャッシュされます。したがって、id
そのような文字列は異なります(詳細については、「is」演算子は、文字列をスペースと比較するときに異なる動作をします):
>>> id('foo')
162861592
>>> id('foo')
162861568
英数字以外の文字列 (同じ を使用id
):
>>> id('foo!&9((&')
162840000
>>> id('foo!&9((&')
162840000