2015-12-12 4 views
5

मुझे लगता है कि यह पूछने के लिए थोड़ा अजीब सवाल है।
बात यह है कि जब मैं django कोड के कुछ हिस्सों का अध्ययन कर रहा था, तो मैंने कुछ ऐसा देखा जो मैंने पहले कभी नहीं देखा था।
Copy Difference Question और It's usage in dictionary के अनुसार हम एक ही संदर्भ के साथ दो शब्दकोश बना सकते हैं।क्यों एक तीर उथली प्रतिलिपि खुद को स्थापित करना?

प्रश्न यह है कि एक शब्दकोश की उथली प्रतिलिपि स्वयं को सेट करने का उद्देश्य क्या है?
कोड:

django.template.backends.base

params = { 
    'BACKEND' = 'Something', 
    'DIRS' = 'Somthing Else', 
} 
params = params.copy() 

उत्तर

5

प्रासंगिक हिस्सा है या django.template.backends.base.py इस तरह दिखता है:

class BaseEngine(object): 

    # Core methods: engines have to provide their own implementation 
    #    (except for from_string which is optional). 

    def __init__(self, params): 
     """ 
     Initializes the template engine. 
     Receives the configuration settings as a dict. 
     """ 
     params = params.copy() 
     self.name = params.pop('NAME') 
     self.dirs = list(params.pop('DIRS')) 
     self.app_dirs = bool(params.pop('APP_DIRS')) 
     if params: 
      raise ImproperlyConfigured(
       "Unknown parameters: {}".format(", ".join(params))) 

शब्दकोश def __init__(self, params): में params कॉपी किया जायेगा पर नया शब्दकोश params = params.copy()। यह सिर्फ एक ही नाम का उपयोग करता है। इसलिए, पुराने नाम को इस नाम के माध्यम से और अधिक नहीं पहुंचा जा सकता है। अगले चरणों में नया स्थानीय शब्दकोश संशोधित किया गया है लेकिन मूल एक अपरिवर्तित रहता है।

self.params = params करना, params = params.copy() के बजाय बहुत अलग प्रभाव होगा। इस मामले में self.paramsparams के पीछे ऑब्जेक्ट के लिए सिर्फ दूसरा नाम होगा। चूंकि यह एक शब्दकोश और परिवर्तनीय है, इसलिए self.params में सभी परिवर्तन params प्रभावित होंगे। params.pop('NAME') शब्दकोश से NAME' कुंजी हटा देता है। असल में, एक चेक है कि यह खाली है: params.pop('NAME')

+0

अच्छी तरह से आपने जो कहा है, उससे मैं समझता हूं कि उन्होंने इसे इस्तेमाल करने के लिए सिर्फ निर्देश की प्रतिलिपि बनाई है, लेकिन इसे बदलने के लिए नहीं: तो क्यों नहीं: 'self.params = params' इसके बजाय? – Heartagramir

+0

वे इसे बदलते हैं। मेरे उत्तर में इसके बारे में एक खंड जोड़ा गया। –

+0

अब मुझे यह मिल गया है ... इसे बदलने के बिना एक नियम का उपयोग करने के लिए हम प्रतिलिपि() का उपयोग करते हैं। और यह सब नहीं है ... self.params कक्षा के लिए एक नया चर नहीं बनायेगा ... यह सिर्फ उस विशिष्ट वस्तु के अंदर उपयोग करने के लिए var की प्रतिलिपि बनाता है और फिर भी यह वही वस्तु है। – Heartagramir

संबंधित मुद्दे