python - तारों द्वारा संदर्भित स्ट्रिंग्स नहीं हैं?



string dictionary (1)

इस पायथन कोड को देखें:

from gc import get_referrers as refs
x = 'x'
d = {x:x}
print(d in refs(x))

यह झूठी छपाई करता है यह अपने आप से अजीब है, लेकिन जब आप निम्नलिखित पर विचार करते हैं तो बहुत अधिक होता है:

  • यदि x एक स्ट्रिंग के स्थान पर एक नंबर (इंट, फ्लोट, कॉम्प्लेक्स, फ्रेक्शन, डेसीमल) है, तो यह अभी भी झूठी छपाई करता है। बाइट्स और बायटेयर के लिए भी लेकिन हर दूसरे प्रकार के लिए (यदि संभवतः ट्यूप्ले या फ्रॉजेनेट जैसे कुंजी के रूप में उपयोग किया जाता है - लेकिन कई अन्य, यदि केवल मान के रूप में उपयोग किया जाता है), तो यह सच को प्रिंट करता है

  • अगर घ किसी अन्य कंटेनर (सेट, सूची, ट्यूपल ...) को एक्स है, तो यह सत्य को प्रिंट करता है केवल एक शब्द के लिए, यह झूठी छपाई करता है। इसके अलावा, यह कोई फर्क नहीं पड़ता कि अगर x एक चाबी या मूल्य है, या ऊपर के रूप में, दोनों।

मैंने सोचा था कि पायथन में हर वस्तु एक संदर्भ है (जावा के विपरीत, जो कि आदिम प्रकार या रूबी हैं, जो मूल्य-प्रकार के छोटे इनट हैं), लेकिन अब यह लगता है कि str और int थोड़े आदिम प्रकार हैं, जो संदर्भित नहीं हैं। लेकिन दूसरी ओर, क्यों केवल लेखों में ??

मुझे यह भी पता है कि -5 से 256 में सीपीआईथॉन (और छोटी सी तारों को इंन्टर किया जा सकता है) में कैश किया जाता है, इसलिए यह उन्हें संदर्भित करने के लिए समझ में नहीं आता है, क्योंकि वे कभी भी हटाए नहीं जाएंगे, लेकिन यह किसी भी इंटिजर्स (और लंबी स्ट्रिंग्स के लिए काम करता है ) मैंने कोशिश की है, उस सीमा से अधिक बड़ा है

क्या कोई जानता है कि यहाँ क्या हो रहा है?

--- अद्यतन करें ---

जिज्ञासु और जिज्ञासु ... यह दिन-समय लगता है। {दिनांक समय, दिनांक, समय} वर्गों में "अनरेन्फरर्ड" व्यवहार समान होता है अब, मुझे एक बात पता है कि उन, एएनएसटीआर और नंबर में समान हैं: उनके हैश प्रति-सत्र नमक के साथ यादृच्छिक होते हैं लेकिन यह कोई मतलब नहीं है, क्योंकि व्यवहार तब भी मनाया जाता है जब ये केवल डिक्ट्स में मूल्य हैं, चाबी नहीं। और मूल्यों को धोया नहीं है या क्या वे?


gcmodule.c :

कुछ प्रकार के कंटेनर संदर्भ चक्र में भाग नहीं ले सकते, और इसलिए कचरा कलेक्टर द्वारा ट्रैक किए जाने की आवश्यकता नहीं है इन वस्तुओं को अनवरोधित करने से कचरा संग्रह की लागत कम हो जाती है। हालांकि, यह निर्धारित करने के लिए कि कौन सा ऑब्जेक्ट अन्तर्निहित नहीं हो सकते, यह मुफ़्त नहीं है, और कचरा संग्रहण के लिए लाभों के बारे में लागतों का वजन होना चाहिए।

...

केवल अपरिवर्तनीय वस्तुओं वाले शब्दकोशों को भी ट्रैक करने की आवश्यकता नहीं है। जब बनाया जाता है तो शब्दकोशों को अनसुझाया जाता है यदि किसी ट्रैक किए गए आइटम को किसी शब्दकोश में डाला जाता है (या तो एक कुंजी या मान के रूप में), तो शब्दकोश ट्रैक हो जाता है पूर्ण कचरा संग्रह (सभी पीढ़ियों) के दौरान, कलेक्टर किसी भी शब्दकोशों को अनदेखा कर देगा, जिनकी सामग्री को ट्रैक नहीं किया गया है।

असल में, क्योंकि अजगर में वस्तु संदर्भ-गिनती है, कचरा कलेक्टर का लक्ष्य संदर्भ चक्र को तोड़ना है, जब दूसरे संदर्भ में अंतिम संदर्भ दूर होने पर अन्य अपरिवर्तित वस्तुएं नष्ट हो जाती हैं। अनुकूलन के लिए, कचरा कलेक्टर कुछ वस्तुओं का ट्रैक नहीं रखता है जो संदर्भ चक्रों में आसानी से भाग नहीं ले सकते हैं।

इसलिए, तार संदर्भित होते हैं हालांकि, कचरा कलेक्टर इन शब्दकोशों में बिल्कुल भी दिलचस्पी नहीं है और इसलिए gc.get_referrers() उनकी सूची नहीं है।





cpython