2012-12-29 16 views
10
cache = {} 
def func(): 
    cache['foo'] = 'bar' 
print cache['foo'] 

उत्पादनइस मामले में वैश्विक कीवर्ड की आवश्यकता क्यों नहीं है?

bar 

क्यों यह काम और क्यों यह global कीवर्ड के उपयोग की आवश्यकता नहीं है करता है?

+1

म्यूटेबल ऑब्जेक्ट्स के लिए 'ग्लोबल' की आवश्यकता नहीं है। –

उत्तर

11

क्योंकि आप से cache असाइन नहीं कर रहे हैं, तो आप इसके बजाय शब्दकोश को बदल रहे हैं। cache अभी भी शब्दकोश को इंगित कर रहा है, इस प्रकार स्वयं अपरिवर्तित है। लाइन cache['foo'] = 'bar'cache.__setitem__('foo', 'bar') पर अनुवाद करती है। दूसरे शब्दों में, cache का मान एक पायथन dict है, और वह मान स्वयं परिवर्तनीय है।

आप बदलना क्या cache बजाय cache = 'bar' उपयोग करके, आप को बदलने की जाएगी क्या करने के लिए cache अंक और फिर आप global कीवर्ड की जरूरत को दर्शाता है की कोशिश की है।

शायद इसी तरह के प्रश्न का मेरा पुराना उत्तर आपको अंतर को समझने में मदद करता है: Python list doesn't reflect variable change

+1

तो इस तरह कोई 'वैश्विक' कीवर्ड रखने के पूरे बिंदु को खारिज कर सकता है? –

+1

@ बनी खरगोश: 'ग्लोबल' कीवर्ड रखने का * बिंदु * पाइथन कंपाइलर के लिए है कि यह जानने के लिए कि कौन सी संरचना बदलनी है। पूरी तरह समझते हैं कि इसकी आवश्यकता क्यों है पाइथन ('स्थानीय()' बनाम 'ग्लोबल्स()' और बाइट कोड और ऐसे) के आंतरिक कार्यकलापों में डेलिंग की आवश्यकता है। यहां कुछ भी निंदा नहीं किया जा रहा है, एक गतिशील भाषा आपको ग्लोबल्स को संशोधित करने से रोकने की कोशिश करने के बारे में नहीं है। :-) –

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