2009-10-29 31 views
16

gc.collect() numaralı telefonu aradığımda bile çöp koleksiyonunun atlamayı reddettiği bir nesneyi el ile kaldırmanın herhangi bir yolu var mı? Python'da ÇalışmaPython'da manuel çöp toplama

+1

Python hakkında bir şeyler bilmezsiniz, ancak bazı çöp toplayıcıları, bazen nesnelerin hala kullanımda olduğunu düşünürler; çünkü bu nesnelerin (* aslında) olmadığı için * göründüklerini * bulurlar. Bu gibi durumlarda yapabileceğiniz pek bir şey yok. – Artelius

+1

Ayrıca, Python 3.1 ASAP. 3.0 bir dizi bilinen problemlere sahiptir ve artık desteklenmemektedir. –

+2

Onurları bitirir bitirmez, niyetim var. – Casebash

cevap

24

, the docs Başına sadece arkadaşlar kalıcı olacak). Bundan sonra, bir şekilde siyah bir sanattır ;-). Sıklıkla bazı yönlendirenlerin listelendiğini görürsünüz (bu nedenle, thatobject numaralı telefonu kastediyorsunuz? Yani acil durum modunda .remove yapabilir, ancak normal kod sesini daha iyi hale getirebilirsiniz ...), ve hatta daha sık, dict s (birçoğu, bir sınıf örneğinin veya başka birisinin __dict__ s'si olabilir, hangisinin hangisi olduğunu anlamak için genellikle önemsiz değildir ... kaba kuvvet kaldırma, bazen acil bir acil çözümdür, ancak hiçbir zaman uzun süreli sürdürülebilir bir çözüm değildir. ! -).

1

Python'unuzun üzerinde çalıştığı duruma bağlıdır. ayrıntıları aktaran

açıklıyor Here's good article: CPython güncel sürümlerde

, döngü içine x her yeni atama daha önce tahsis edilen kaynak yayınlayacak. GC kullanarak, bu garanti edilmez. Herhangi bir Python uygulamasıyla çalışacak bir kod yazmak isterseniz, kaynağı açıkça kapatmalısınız; Bu GC ne olursa olsun çalışır:

for name in big_list: 
    x = Resource() 
    do something with x 
    x.close() 
4

GC onu yok etmeyi reddediyor ise, bir yerde bir referansı var çünkü bu kadar. Referansdan kurtulun ve (sonunda) gidecek. Örneğin:

myRef = None 

o gerekmedikçe GC mutlaka senin nesne yok olabilir unutmayın. Nesneniz Python yönetimi altında olmayan kaynakları tutuyorsa (örneğin, Python'dan C koduyla bazı hileler), nesne bir kaynak serbest bırakma çağrısı sağlamalıdır, böylece Python karar verirken değil, istediğiniz zaman bunu yapabilirsiniz. .

4

del Ya Nonegc.get_referrers(thatobject) nesne hala hayatta olmasının nedeni (size anlatmak emin istenmeyen "Canlılık" yapmak için doğru bir gc.collect() sonra yapacak

>>> a = "Hello" 
>>> a = None 
Or 
>>> del a 
+1

Mutlaka doğru değil. Nesnenin sadece yeniden elde edilebilmesi için ulaşılamaması (ya da birincisi ile çok umutlu bir şekilde kabul edeceği anlaşılır bir atılabilir ref-sayımı olması) gerekir. –

+5

'del a' nesneyi silmez (sadece bir not; ima ettiğinizi ima etmeyiniz) – hasen

İlgili konular