2015-09-24 12 views
6

私はPythonの組み込みid()がオブジェクトの存続期間中一意のIDを返すことを理解します。生存期間が重複していないオブジェクトは、同じIDで終わることがあります。Pythonオブジェクトの反復可能なIDの衝突

>>> id(matplotlib.image.BboxImage.set_cmap) 
4424372944 
>>> id(numpy.ma.core.MaskedArray.sum) 
4424372944 

と複数のインタプリタインスタンス間で実際には、動作は反復可能である:しかし、私はこのかなり紛らわしい行動を理解しようとしています

Mac:~$ python2.7 -c "import matplotlib.image; import numpy; print id(matplotlib.image.BboxImage.set_cmap), id(numpy.ma.core.MaskedArray.sum)" 
4343186208 4343186208 
Mac:~$ python2.7 -c "import matplotlib.image; import numpy; print id(matplotlib.image.BboxImage.set_cmap), id(numpy.ma.core.MaskedArray.sum)" 
4521153312 4521153312 
Mac:~$ python2.7 -c "import matplotlib.image; import numpy; print id(matplotlib.image.BboxImage.set_cmap), id(numpy.ma.core.MaskedArray.sum)" 
4358591264 4358591264 
Mac:~$ python2.7 -c "import matplotlib.image; import numpy; print id(matplotlib.image.BboxImage.set_cmap), id(numpy.ma.core.MaskedArray.sum)" 
4389970720 4389970720 

matplotlib.image.BboxImage.set_cmapnumpy.ma.core.MaskedArray.sumが常に同じIDを取得することが表示されますPythonインタプリタの異なるインスタティックにもかかわらず、お互いに。の場合は、id()のドキュメントと一貫していることを理解しました。これらの2つのオブジェクトはアクセス時に動的に作成されるため、重複しない存続時間を持つためです。しかし、なぜこれら2つの関係のないオブジェクトは、常に同じIDで終了しますか?

(これは、単に複数のインタプリタインスタンスではなく、非オーバーラップ寿命を持つオブジェクトのスプリアスIDの衝突間で反復可能である理由をここで私が求めているので、この質問はObject methods of same class have same id?に異なります。)

答えて

6

これはtrueになりますインスタンスメソッドです。これは、テストしている両方のオブジェクトのタイプです。記述子にアクセスするたびに、新しいinstancemethodオブジェクトがインスタンス化されます。新しく作成されたメソッドへの参照を保存していないので、idが返されるとすぐにガベージコレクションの対象となり、次のidの呼び出しの前に収集されているため、同じメモリの場所を再利用できます。

この現象は、別の方法で見ることができる:set_cmapを参照すると、新しいinstancemethodオブジェクトを毎回作成するため

>>> x = matplotlib.image.BboxImage.set_cmap 
>>> y = matplotlib.image.BboxImage.set_cmap 
>>> id(x) == id(y) 
False 

xyは、二つの異なるオブジェクトへの参照です。

関連する問題