TLDR: पायथन नाम स्वचालित डी / संदर्भित के साथ संकेत की तरह काम करते हैं लेकिन स्पष्ट सूचक संचालन की अनुमति नहीं देते हैं। अन्य लक्ष्य अप्रत्यक्षों का प्रतिनिधित्व करते हैं, जो संकेत के समान व्यवहार करते हैं।
सीपीथॉन कार्यान्वयन हुड के तहत प्रकारPyObject*
के पॉइंटर्स का उपयोग करता है । जैसे, नाम से शब्दार्थों को सूचक कार्यों में अनुवाद करना संभव है। कुंजी वास्तविक वस्तुओं से नामों को अलग करने के लिए है ।
उदाहरण पायथन कोड में नाम ( i
) और ऑब्जेक्ट्स ( 5
) दोनों शामिल हैं ।
i = 5
j = i
j = 3
इसे अलग-अलग नामों और वस्तुओं के साथ मोटे तौर पर सी कोड में अनुवाद किया जा सकता है ।
int three=3, five=5; // objects
int *i, *j; // names
i = &five; // name `i` refers to position of object `5`
j = i; // name `j` refers to referent of `i`
j = &three; // name `j` refers to position of object `3`
महत्वपूर्ण हिस्सा यह है कि "नाम-के-संकेत" वस्तुओं को संग्रहीत नहीं करते हैं! हमने परिभाषित नहीं किया *i = five
, लेकिन i = &five
। नाम और वस्तु एक दूसरे से स्वतंत्र होते हैं।
नाम केवल मौजूदा वस्तुओं को स्मृति में इंगित करते हैं ।
नाम से नाम निर्दिष्ट करते समय, कोई भी वस्तुओं का आदान-प्रदान नहीं किया जाता है! जब हम परिभाषित करते हैं j = i
, तो यह बराबर होता है j = &five
। न तो i
है और न ही j
दूसरे से जुड़े हैं।
+- name i -+ -\
\
--> + <five> -+
/ | 5 |
+- name j -+ -/ +----------+
परिणामस्वरूप, एक नाम के लक्ष्य को बदलने से दूसरे पर कोई असर नहीं पड़ता है । यह केवल वही अपडेट करता है जो उस विशिष्ट नाम को इंगित करता है।
पायथन में अन्य प्रकार के नाम जैसे तत्व भी हैं : विशेषता संदर्भ ( i.j
), सदस्यता ( i[j]
) और टुकड़ा करने की क्रिया ( i[:j]
)। नामों के विपरीत, जो वस्तुओं को सीधे संदर्भित करते हैं, तीनों अप्रत्यक्ष रूप से वस्तुओं के तत्वों को संदर्भित करते हैं।
उदाहरण कोड में दोनों नाम ( i
) और एक सदस्यता ( i[0]
) शामिल हैं।
i = [1,2,3]
j = i
i[0] = 5
एक सीपीथॉन हुड के नीचे बिंदुओं की list
एक सी सरणी का उपयोग करता है PyObject*
। इसे फिर से अलग-अलग नामों और वस्तुओं के साथ सी कोड में अनुवाद किया जा सकता है।
typedef struct{
int *elements[3];
} list; // length 3 `list` type
int one = 1, two = 2, three = 3, five = 5;
list values = {&one, &two, &three}; // objects
list *i, *j; // names
i = &values; // name `i` refers to object `[1, 2, 3]`
j = i; // name `j` refers to referent of `i`
i->elements[0] = &five; // leading element of `i` refers to object `5`
महत्वपूर्ण बात यह है कि हमने कोई भी नाम नहीं बदला है! हमने परिवर्तन किया i->elements[0]
, एक वस्तु का तत्व जो हमारे नाम दोनों को इंगित करता है।
मौजूदा यौगिक वस्तुओं के मूल्यों को बदला जा सकता है।
नाम के माध्यम से किसी वस्तु के मूल्य को बदलते समय , नाम नहीं बदले जाते हैं। दोनों i
और j
अभी भी उसी वस्तु को संदर्भित करते हैं, जिसका मूल्य हम बदल सकते हैं।
+- name i -+ -\
\
--> + <values> -+
/ | elements | --> [1, 2, 3]
+- name j -+ -/ +-----------+
मध्यवर्ती वस्तु एक पॉइंटर के समान व्यवहार करती है जिसमें हम सीधे उसको बदल सकते हैं जो इसे इंगित करता है और इसे कई नामों से संदर्भित करता है।