मेरे पास एक ऐसी स्थिति है जिसमें मैं पहली वस्तु मौजूद होने तक एक ऑब्जेक्ट से दूसरे ऑब्जेक्ट में मैपिंग को बनाए रखना चाहता हूं। मेरा पहला विचार एक WeakKeyDictionary का उपयोग करना था।जीसी WeakKeyDories में परिपत्र संदर्भ हटा नहीं है?
import weakref
import gc
class M:
pass
w = weakref.WeakKeyDictionary()
m = M()
w[m] = some_other_object
del m
gc.collect()
print w.keys()
यह ज्यादातर मामलों में ठीक काम करता है। हालांकि, उस मामले में जहां some_other_object
m
है (या इसका संदर्भ है) M
उदाहरण कचरा एकत्र नहीं किया जाएगा। (एक उदाहरण देखने के लिए, m
साथ some_other_object
की जगह)
, अगर मैं वस्तु पर ही मानचित्रण संग्रहीत, यह कचरा एकत्र किया जाएगा जब मैं इसे नष्ट कर दिया:
import weakref
import gc
class M:
pass
m = M()
m.circular_reference = m
r = weakref.ref(m)
del m
gc.collect()
print r
मैं परिणाम प्राप्त कर सकते हैं कमजोर मॉड्यूल का उपयोग करते हुए दूसरे उदाहरण का (यानी m
को म्यूट किए बिना)?
दूसरे शब्दों में, क्या मैं किसी ऑब्जेक्ट को अपने आप को मैप करने के लिए कमजोर मॉड्यूल का उपयोग कर सकता हूं (या किसी अन्य ऑब्जेक्ट जिसमें इसका मजबूत संदर्भ है) और केवल ऑब्जेक्ट को याद रखें जब तक कि इसके अन्य संदर्भ न हों?
क्या आप" एक अलग तंत्र के माध्यम से वाक्यांश को विस्तृत कर सकते हैं जिसमें मजबूत संदर्भ शामिल नहीं है "? यह तंत्र क्या है और आप क्यों कहते हैं कि यह एक मजबूत संदर्भ नहीं है? मैं सहमत हूं कि आपका निष्कर्ष (हालांकि असंतोषजनक है!), और मैं आपका जवाब स्वीकार करने के इच्छुक हूं, लेकिन मुझे इस बिंदु पर स्पष्टीकरण पसंद आएगा। – matthewwithanm
इस नियम में मूल्य का एक मजबूत संदर्भ है। यदि कुंजी एकत्र की जाती है, तो ताना अधिसूचित किया जाता है और मूल्य के संदर्भ को जारी करता है। तो यह कुछ हद तक व्यवहार करता है जैसे कि कुंजी के मान का संदर्भ है (जो एक संदर्भ सर्कल पूरा करेगा), लेकिन वास्तविकता में कोई प्रत्यक्ष संदर्भ नहीं है। इसके बजाए, एक कुंजी के बिना समान परिणाम उत्पन्न करने के लिए कुंजी कुंजी और मूल्य के बीच बैठता है-> मान संदर्भ। क्या उससे मदद हुई? मुझे डर है कि मेरी व्याख्या थोड़ा सा परिपत्र है (और अब पन पूरा हो गया है कि पोस्ट संदर्भ खुद ही हैं)। – Luke