2015-09-24 18 views
6

id() python yerleşkesinin, bir nesnenin kullanım ömrü için benzersiz bir kimlik döndürdüğünü anlıyorum. Örtüşmeyen yaşam süreleri olan nesneler, anladığım kadarıyla aynı kimliğe sahip olabilirler. Ancak, ben bu oldukça kafa karıştırıcı davranışı anlamaya çalışıyorum:Python nesnelerinde yinelenebilir kimlik çakışmaları

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

Ve birden tercüman örneği arasında aslında, davranış tekrarlanabilir:

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 

O matplotlib.image.BboxImage.set_cmap ve numpy.ma.core.MaskedArray.sum hep aynı kimliği olsun görünür Python yorumlayıcısının farklı ifadeleri arasında bile birbirlerinin.

Artık bunun, bu iki nesnenin erişildiğinde dinamik olarak oluşturulduğundan ve bu nedenle gerçekten örtüşmeyen yaşam süreleri olacağından, id() belgelerine uygun olduğunu anlıyorum. Fakat bu iki ilgisiz nesne neden hep aynı kimliğe sahip olur?

(Bu oldukça örtüşmeyen ömürleri ile nesneler üzerinde sadece bir sahte kimlik çatışması yerine, birden tercüman örneği arasında tekrarlanabilir neden soruyorum burada, çünkü bu soru Object methods of same class have same id? farklıdır.)

cevap

6

Bu doğru olacaktır Test ettiğiniz nesnelerin türü olan herhangi bir örnek yönteminin örnek yöntemidir. Tanımlayıcıya her eriştiğinizde, yeni bir instancemethod nesnesi başlatılır. Yeni oluşturulan yönteme bir referans kaydetmediğiniz için, id döner dönmez çöp toplama için uygundur ve görünüşe göre id sonraki aramadan önce toplanıyor, böylece aynı bellek konumu yeniden kullanılabilir.

Bu davranış

başka bir şekilde görülebilir:

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

x ve y iki ayrı nesnelere atıfta bulunulmaktadır set_cmap referans yeni instancemethod nesnesi her oluşturduğundan.

İlgili konular