2011-09-25 24 views
5

Neden her sayıda veya basit dize için"sys.getrefcount()" dönüş değeri

sys.getrefcount() 

dönüş 3? O 3 nesneler Programda yere ikamet mı? Ayrıca, neden ayarı anlamına mı geliyor gelmez x = (çok büyük sayı) nesnenin ref sayısını arttırır mı? 3 ref sayımı getrefcount çağrımdan kaynaklanır mı? Bunu açıkladığınız için teşekkür ederiz. Örneğin

:

>>> sys.getrefcount(4234234555) 
3 
>>> sys.getrefcount("testing") 
3 
>>> sys.getrefcount(11111111111111111) 
3 
>>> x=11111111111111111 
>>> sys.getrefcount(11111111111111111) 
3 
+0

x = "sınama", ref sayısını artırmasına rağmen x = (büyük sayı) göstermez. – kaiseroskilo

cevap

9

Büyük tamsayı nesneleri iki farklı nesneleri almak, böylece Interpretor tarafından yeniden değildir:

>>> a = 11111 
>>> b = 11111 
>>> id(a) 
40351656 
>>> id(b) 
40351704 

bir taze başvuru sayısı ölçen çünkü sys.getrefcount (11111) her zaman aynı sayıda döndürür nesne.

Genellikle
>>> sys.getrefcount(1) 
73 

yeni nesneye tek referansı alacağı: küçük tamsayıları için

, Python her zaman aynı nesneyi yeniden kullanır

>>> sys.getrefcount(object()) 
1 

Ama tamsayılar özel öncesi tahsis edilir performans optimizasyonu için Python tarafından malloced alan ve ben ekstra iki referansların bununla ilgili bir şey olduğundan şüpheleniyorum.

Burada C uygulaması bakabilirsiniz:

print sys.getrefcount('foo1111111111111' + 'bar1111111111111') #1 
print sys.getrefcount(111111111111 + 2222222222222)   #2 
print sys.getrefcount('foobar333333333333333333')    #3 
: Ben geçici başvuruları önbelleğe iş yerinde birkaç şey vardır düşünüyorum ben lowlevel ayrıntılarında neler olup bittiğini anlamak için iddia etmiyorum: http://svn.python.org/view/python/trunk/Objects/intobject.c?view=markup

Düzenleme

6
  1. Küçük dizeleri ve tamsayılar nesne inşaat maliyetini kaydetmek için Python tarafından önbelleğe alınır.

  2. Etkileşimli Python yorumcusu, girdiğiniz her bir harf için geçici bir başvuruya sahiptir. getrefcount('foo' + 'bar') ile getrefcount('foobar')'u karşılaştırın. (İkinci durumda, tercüman 'foo' ve 'bar' başvurular vardır.) manual itibaren

  3. :

döndü sayımı genellikle beklediğinizden daha yüksektir biridir, o içerdiğinden (Geçici) getrefcount()'a bir argüman olarak referans.

+0

Yani geçici ref için önbellek + 1 için 1'dir. Üçüncü olan hakkında ne var? Bu Python'un içlerine ait mi? – kaiseroskilo

+2

@kaiseroskilo: Hayır, geçici referanslar için +2; Biri etkileşimli üst düzeyde ve bir tanesi getrefcount'un kendisinde çünkü nesne bir argüman olarak geçiyor. –

+0

Tamam şimdi anlıyorum! – kaiseroskilo