14

私の知る限り、Python ではすべてがオブジェクトであり、id()はオブジェクトごとに異なる数値を返す必要があります (私は正しいですか?)。

私の場合、 return 、id(1)returnsですが、すべての浮動小数点型、 return 、 return などで同じ値を取得します。4298178968id(2)4298178944id(1.1)4298189032id(2.2)4298189032

すべての float 値に対して同じIDを取得するのはなぜですか?

4

2 に答える 2

21

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 インタープリター自体が既にそれらを参照しており、インタープリターが終了するまでそれらを削除しないため、これらの整数はすべて一意のメモリ アドレスを持ちます。

于 2013-06-16T09:57:13.723 に答える
5
>>> 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
于 2013-06-16T10:00:33.007 に答える