इस चर का एक कुछ हद तक unintuitive behavor है। ऐसा इसलिए होता है क्योंकि, पायथन में, चर हमेशा मानों के संदर्भ होते हैं।
कुछ भाषाओं में, हम "बॉक्स" जहाँ हम मूल्यों डाल के रूप में चर के बारे में सोचने के लिए करते हैं; पाइथन में, हालांकि, वे संदर्भ हैं, और मूल्यों के लिए टैग या "उपनाम" जैसे अधिक व्यवहार करते हैं। इसलिए, जब आप 1 से item
विशेषता देते हैं, तो आप केवल वेरिएबल संदर्भ बदल रहे हैं, न कि जिस सूची में यह इंगित कर रहा है।
को देखते हुए है कि, देखते हैं क्या होता है जब हम अपने पहले पाश निष्पादित द्वारा बनाई गई सूची का प्रतिनिधित्व करता है।
ध्यान दें कि वर्ष संदर्भ खो दिया है (यह लाल तीर है) और अब हम एक नया है। लेकिन हमने सिर्फ एक चर को एक सूची में बदल दिया - हमने सूची को स्वयं नहीं बदला।
फिर, हम दूसरे sublist को item
अंक पाश की दूसरी यात्रा के लिए दर्ज करें, और अब:
जब हम item = 1
निष्पादित, फिर से, हम सिर्फ चर बिंदु aonther मूल्य के लिए कर , सूची को बदले बिना:
अब, क्या होता है जब हम दूसरे लूप निष्पादित?
दूसरा पाश
दूसरे लूप पहले एक के रूप में शुरू होता है: हम item
पहले sublist का उल्लेख करते हैं:
पहले अंतर यह है कि हम फोन item.append()
है। append()
एक विधि है, इसलिए यह उस ऑब्जेक्ट का मूल्य बदल सकता है जिसे वह कॉल कर रहा है। हम कहते हैं कि करने के लिए उपयोग के रूप में, हम मूल्य से 10 संलग्न करने के लिए इस मामले में वस्तु item
द्वारा बताया करने के लिए एक संदेश भेज रहे हैं, आपरेशन नहीं चर item
में किया जा रहा है, लेकिन सीधे वस्तु यह दर्शाता है में है!
हालांकि, हम केवल एक मूल्य सूची को संलग्न नहीं है: तो यहाँ item.append()
बुला का परिणाम है! हम item.append()
द्वारा दिए गए मान को भी असाइन करते हैं। यह item
उपन्यास के संदर्भ को अलग करेगा, लेकिन यहां एक पकड़ है: append()
None
देता है।
None
मूल्य
None
एक मूल्य है कि प्रतिनिधित्व करता है, मूल रूप से, एक प्रासंगिक मूल्य की अनुपलब्धता है। जब कोई फ़ंक्शन None
लौटाता है, तो यह कह रहा है, ज्यादातर समय, "मेरे पास आपको वापस देने के लिए कुछ भी प्रासंगिक नहीं है।" append()
अपनी सूची सीधे बदलता है, इसलिए इसे वापस करने की आवश्यकता नहीं है।
यह महत्वपूर्ण है क्योंकि आप शायद मानते हैं कि item
संलग्न सूची [1, 2, 10]
पर इंगित करेगा, है ना? नहीं, अब यह None
पर इंगित करता है। तो, आप नीचे दिए गए कोड की अपेक्षा करेंगे ...
alist = [[1,2], [3,4], [5,6]]
for item in alist:
item = item.append(10)
print(item)
कुछ इस तरह मुद्रित करने के लिए:
[1, 2, 10]
[3, 4, 10]
[5, 6, 10]
लेकिन इस नहीं होता है। के रूप में हम टिप्पणी की, append()
पद्धति को बदल कर सूचियों खुद को,
>>> alist = [[1,2], [3,4], [5,6]]
>>> for item in alist:
... item = item.append(10)
... print(item)
...
None
None
None
फिर भी: यह क्या होता है। इसलिए, item
असाइनमेंट के बाद परिवर्तनीय बेकार था, अंतिम सूची संशोधित की गई है!
>>> print alist
[[1, 2, 10], [3, 4, 10], [5, 6, 10]]
आप पाश अंदर संलग्न सूची का उपयोग करना चाहते हैं, तो बस item
को विधि दिए गए मान नहीं देते। यह करें:
>>> alist = [[1,2], [3,4], [5,6]]
>>> for item in alist:
... item.append(10)
... print item
...
[1, 2, 10]
[3, 4, 10]
[5, 6, 10]
यह काम करता है क्योंकि item
अभी भी सूची को इंगित करेंगे।
निष्कर्ष
संदर्भ कुछ हद तक पहली बार में समझने के लिए, अकेले मास्टर जाने जटिल हैं। फिर भी, वे वास्तव में शक्तिशाली हैं और यदि आप उदाहरणों का पालन करते हैं तो सीखा जा सकता है। आपका उदाहरण थोड़ा जटिल है क्योंकि यहां और भी कुछ हो रहा है।
Python Tutor क्या हो रहा है यह समझने में आपकी सहायता कर सकता है, क्योंकि यह प्रत्येक चरण को ग्राफिक रूप से निष्पादित करता है। Check your own code running there!
इस तरह इस्तेमाल होने पर पहला परिवर्तन: 'एलिस्ट में आइटम के लिए: alist [alist.index (item)] = 1' तो 'item' एक लूप में स्थानीय चर है, बाहर कुछ भी नहीं करें। पाइथन में प्रत्येक 'ब्लॉक के लिए – dsgdfg