2

を使用して、次の結果に驚いていますPython 2.7.4

>>> id(5)
5068376

>>> id(5)
5068376

式 5 が評価されると、ID が 5068376 の新しいオブジェクトが作成されます。ここで、同じステートメントを繰り返すと別の新しいオブジェクトが作成され、その ID は一意になると予想されます。オブジェクトへの参照およびオブジェクトはガベージ コレクションする必要があります。

インタプリタが同じメモリアドレスを再利用しているわけではありません:

>>> id(6)
5068364

>>> id(5)
5068376

それで、何が得られますか?インタープリターは舞台裏でリテラルのバインドを行いますか?

4

2 に答える 2

5

Python 内でシングルトンとして保持される小さな数値の範囲があります。どの参照も常に同じオブジェクトを返し、それらがガベージ コレクションされることはありません。

>>> for x,y in enumerate(range(1000)):
    if x is not y:
        print x,y
        break

257 257
于 2013-04-24T17:44:37.070 に答える
3

ここでは 2 つのことが行われています。

  • 小さな Python 整数 (-5 から 256 まで) はインターンされます。リテラル整数は、同じ数値のまったく同じオブジェクトに変換されます。これらの整数の場合、 id()定数になります。

  • id()、オブジェクトの存続期間中のみ一意です。最初のオブジェクトが再びクリアされた場合、後で別のオブジェクトに再利用できます。リテラルをどこにも保存しないので、メモリ アドレスを再利用できます。

    >>> id('foo bar')
    4572936304
    >>> id('bar baz')
    4572936304
    

    ここで'foo bar''bar baz'は 2 つの異なるオブジェクトですが、それらの有効期間は重複しません。id()最初のオブジェクトが作成され、関数に渡された後、再び破棄されます。次に、2 番目の文字列が作成され、渡されid()て破棄されます。

于 2013-04-24T17:52:44.313 に答える