2013-02-11 14 views
10

किसी सूची में आइटम्स पर पुनरारंभ करने के लिए पायथन में for लूप का उपयोग करते समय item (नीचे) items में संबंधित आइटम को बदल देगा?लूप के लिए पाइथन संदर्भ द्वारा काम करते हैं?

for item in items: 
    item += 1 

क्या आइटम में प्रत्येक आइटम बढ़ेगा या लूप से पहले जैसा ही रहेगा?

:

+5

आप इसे अभी क्यों नहीं देखते? –

+0

नहीं; क्या यह [मेरा पिछला उत्तर] है (http://stackoverflow.com/questions/12080552/python-list-doesnt-reflect-variable-change-new-to-python/12080644#12080644) बिल्कुल मदद करें? –

+0

मुझे नहीं लगता कि यह मूल्य का पीछा करेगा (क्या आप इसे आजमा सकते हैं?) –

उत्तर

12

कोई [नोट मैं अजगर 2.7 और 3.x में रुचि होगी], पायथन में चर नहीं संकेत दिए गए हैं।

वे वस्तुओं को एक ढेर पर संदर्भित करते हैं, और एक चर को आवंटित करने से संदर्भित वस्तु नहीं बदली जाती है, लेकिन परिवर्तनीय। चर और वस्तुओं गुब्बारे से बंधे लेबल की तरह हैं; असाइनमेंट लेबल को इसके बजाय एक अलग गुब्बारे पर reties।

इस previous answer of mine देखें गुब्बारे के उस विचार का पता लगाने के लिए और एक थोड़ा और अधिक लेबल करता है।

उस ने कहा, कुछ ऑब्जेक्ट प्रकार विशिष्ट जगह-जगह अतिरिक्त व्यवहार को लागू करते हैं। वस्तु परिवर्तनशील (गुब्बारा ही बदल सकते हैं) है, तो एक में जगह जोड़ने एक परिवर्तन के बजाय एक काम के रूप में व्याख्या की जा सकती।

तो, पूर्णांक के लिए, item += 1 वास्तव में item = item + 1 जैसा ही है क्योंकि पूर्णांक अपरिवर्तनीय हैं। एक नया पूर्णांक ऑब्जेक्ट बनाने के लिए में है और item उस नई ऑब्जेक्ट को लेबल करें। दूसरी ओर

सूचियाँ, परिवर्तनशील हैं और lst += [other, items] एक lst.__iadd__([other, items]) के रूप में कार्यान्वित किया जाता है और उस lst गुब्बारा ही बदल जाता है। एक काम अभी भी जगह लेता है, लेकिन यह एक reassigment एक ही वस्तु के है, के रूप में .__iadd__() विधि बस एक नया वस्तु के स्थान पर self देता है। हम लेबल को उसी गुब्बारे में फिर से बांधना समाप्त कर देते हैं।

लूप आपको प्रत्येक पुनरावृत्ति पर सूची में अगले आइटम का संदर्भ देता है। यह आपको मूल सूची को स्वयं नहीं बदलने देता है (यह केवल गुब्बारा लेबल का एक और सेट है); इसके बजाय यह आपको निहित प्रत्येक आइटम में एक नया लेबल देता है।

+1

सबसे विशेष रूप से, यह एक असाइनमेंट के बाद उत्परिवर्तन नहीं है ? आप किसी फ़ंक्शन में ऑब्जेक्ट को म्यूटेट करते हैं और फिर आप जो फ़ंक्शन रिटर्न देता है उसे असाइनमेंट करते हैं (जो * केवल ऑब्जेक्ट ही होना चाहिए, लेकिन यह होना आवश्यक नहीं है)? - दूसरे शब्दों में, 'i + = कुछ' वही बात है जैसे' i = i .__ iadd __ (कुछ) ' – mgilson

+1

@mgilson: हाँ,' .__ iadd __() 'उस मामले में 'स्वयं' वापस करने की उम्मीद है। –

+0

हां, उम्मीद है, लेकिन यह नहीं है। मुझे यह इंगित करने के लिए निर्देशक लगता है कि यह स्पष्ट रूप से बताता है कि आप '+ =' का उपयोग करके परिवर्तनीय और अपरिवर्तनीय वस्तुओं के साथ अलग-अलग व्यवहार कैसे प्राप्त कर सकते हैं। – mgilson

3

अच्छा, यह वास्तव में वस्तुओं पर निर्भर करता है।

निम्नलिखित मामला लें:

class test(): 
    pass 

a = test() 
a.value = 1 

b = test() 
b.value = 2 

l = [a,b] 

for item in l: 
    item.value += 1 

for item in l: 
    print item.value 

>>> 
2 
3 

और इस मामले में:

l2 = [1,2,3] 

for item in l2: 
    item += 1 

for item in l2: 
    print item 

>>> 
1 
2 
3 

तो जैसा कि आप देख सकते हैं, तो आप संकेत Martijn के रूप में कहा समझने की जरूरत है।

+0

आप सही हैं, यह तकनीकी रूप से वस्तुओं पर निर्भर करता है (अर्थात् '__iadd__' की परिभाषा पर)। लेकिन जिस तरह से आप दिखाते हैं: आइटम असाइनमेंट * हमेशा * इस तरह काम करता है। आप जो दिखाते हैं वह यह है कि विशेषता असाइनमेंट स्थानीय असाइनमेंट से अलग है, लेकिन यह एक पूरी तरह से अलग मामला है (हालांकि संबंधित और भी महत्वपूर्ण)। -1 – delnan

+2

यह सही नहीं है; आप स्थानीय चर को असाइन नहीं कर रहे हैं, आप किसी अन्य ऑब्जेक्ट पर एक विशेषता को असाइन कर रहे हैं। वह म्यूटेबल ऑब्जेक्ट को म्यूट कर रहा है, स्थानीय चर नहीं। –

+1

मैंने कभी अन्यथा दावा नहीं किया है, सिर्फ यह दिखा रहा है कि जब पाइथन में एक सूची में पुनरावृत्ति होती है तो आप कुछ स्थितियों में वस्तुओं पर काम कर सकते हैं, अन्य भाषाओं में इसे उस ऑब्जेक्ट/सूची में हेरफेर करने की अनुमति नहीं है जिसे आप पुन: सक्रिय कर रहे हैं। –

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