निम्नलिखित फ़ंक्शन पर विचार करें।
def f(x):
x += n
return x * 4
यहां x
एक स्थानीय नाम है, इसका मूल्य बदल सकता है। 4
एक स्थिर है। इसका मूल्य कभी नहीं बदलेगा। हालांकि, यह अभी भी एक वस्तु है और हर बार इसकी आवश्यकता होने पर एक नई वस्तु बनाने के बजाय उन्हें कैश करना बेहतर होता है। अंत में, n
एक वैश्विक संदर्भ है। स्ट्रिंग "n"
फ़ंक्शन द्वारा संग्रहीत है ताकि इसे फ़ंक्शन के वैश्विक संदर्भ से n
पुनर्प्राप्त करने के लिए कुंजी के रूप में उपयोग किया जा सके।
>>> f.__code__.co_nlocals # just 1 (for x)
1
>>> f.__code__.co_consts
(None, 4)
>>> f.__code__.co_names
('n',)
>>> "n" in f.__globals__ and globals() is f.__globals__
True
आत्मनिरीक्षण के प्रयोजनों के लिए नाम रखने और अलग करने का कारण अलग है। Tuples मर्ज करने का एकमात्र असली कारण स्मृति दक्षता होगी, हालांकि यह केवल आपको एक वस्तु और एक सूचक प्रति समारोह प्राप्त करेगा। निम्नलिखित कार्य पर विचार करें।
def g():
return "s" * n
तो consts युक्त टपल टपल युक्त नाम के साथ विलय कर दिया गया है तो आप (नहीं वीएम) बताने के लिए जो मान तक पहुँचने वैश्विक लिए थे और जो समारोह के स्थिरांक थे में सक्षम नहीं होगा।
बस जांचने के लिए, आप cpython के बारे में सही बात कर रहे हैं? कौन सा संस्करण? –
@GamesBrainiac: 'co_names' cpython दोनों 2 और 3 और pypy में प्रयोग किया जाता है। अन्य कार्यान्वयन के बारे में निश्चित नहीं है क्योंकि मैं उनका उपयोग नहीं करता हूं। – 6502
मुझे यह सब ठीक नहीं याद है, लेकिन मुझे पूरा यकीन है कि इसमें पिकलिंग के साथ कुछ करना है। –