2009-06-12 12 views
5

चलो कहते हैं कि मैं एक सूचीलूप के लिए एक अजगर में, वास्तविक प्रतिलिपि, प्रतिलिपि पर मैं कैसे काम करूं?

a = [1,2,3] 

है मैं जगह में है कि सूची के हर आइटम को बढ़ाने के लिए चाहते हैं। मैं तो जब मुझे लगता है कि पाश a अभी भी देता है [1,2 के साथ समाप्त कर रहा हूँ के रूप में वाक्य रचना आसान

for item in a: 
    item += 1 

के रूप में लेकिन यह है कि उदाहरण के अजगर में सिर्फ item का मूल्य, नहीं इसकी वास्तविक संदर्भ का उपयोग करता है कुछ करना चाहता हूँ, 3] [2,3,4] के बजाय। मैं जानता हूँ कि मैं की तरह

a = map(lambda x:x+1, a) 

कुछ कर सकते हैं लेकिन वह वास्तव में मेरे वर्तमान कोड में फ़िट नहीं होता और मैं इसे फिर से लिखने के लिए नफरत करता हूँ: - \

+0

लूप के लिए वास्तव में आपको वास्तविक वस्तु देता है, कॉपी नहीं। बात यह है कि आप संख्याओं का उपयोग कर रहे हैं। संख्या (और तार), सभी पाइथन मूल्यों के रूप में, वस्तुएं हैं, लेकिन प्रत्येक शाब्दिक एक अद्वितीय उदाहरण को संदर्भित करता है। तो यदि आप 1 से 2 का प्रतिनिधित्व करने वाले एक उदाहरण को संशोधित कर सकते हैं, तो आप सभी 1 से 2 में बदलना बंद कर देंगे जो चूसने वाला होगा। विकल्प, प्रत्येक मूल्य के लिए एक उदाहरण होने के लिए व्यवहार्य नहीं होगा। आईडी फ़ंक्शन के साथ खेलने का प्रयास करें: आईडी (1), आईडी ('हैलो वर्ल्ड'), आदि (यह हमेशा एक ही अक्षर के लिए एक ही पता देता है।) – Blixt

उत्तर

18

यहाँ फिर जाना:

# Your for loop should be rewritten as follows: 
for index in xrange(len(a)): 
    a[index] += 1 

संयोग से, आइटम item का संदर्भ a में है, लेकिन निश्चित रूप से आप एक पूर्णांक को नया मान असाइन नहीं कर सकते हैं। किसी भी परिवर्तनशील प्रकार के लिए, अपने कोड ठीक काम करेगा:

>>> a = [[1], [2], [3], [4]] 
>>> for item in a: item += [1] 
>>> a 
[[1,1], [2,1], [3,1], [4,1]] 
+0

Ooooh – spencewah

9
अपने map आधारित समाधान के बजाय

, यहाँ एक सूची-समझ के आधार पर समाधान

a = [item + 1 for item in a] 
12

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

क्या हो रहा है यह है कि: item += 1 आप एक नया पूर्णांक बना रहे हैं (item + 1 के मूल्य के साथ) और item नाम को बाध्यकारी बना रहे हैं।

आप जो करना चाहते हैं, वह a[index] अंक पूर्णांक को बदलता है, यही कारण है कि a[index] += 1 कार्य करता है। आप अभी भी एक नया पूर्णांक बना रहे हैं, लेकिन फिर आप इसे इंगित करने के लिए सूची अपडेट कर रहे हैं।

एक तरफ ध्यान दें के रूप में:

for index,item in enumerate(a): 
    a[index] = item + 1 

... जवाब त्रिफलक द्वारा पोस्ट की तुलना में थोड़ा अधिक मुहावरेदार है।

+1

को साफ़ करने के लिए धन्यवाद, मैंने गणना करना शुरू कर दिया और कर सकते हैं याद नहीं है कि मैं अब क्यों बदल गया - हाहा। मुझे लगता है कि मैं काम करने के लिए चिपकना चाहता था किसी भी नौसिखिया प्रोग्रामर को पता चलने की संभावना है, इसलिए मैं संख्या से लेकर सीमा (लेन()) तक गया, फिर फैसला किया कि मैं रेंज() की स्नीकी मेमोरी उपयोग को प्रोत्साहित नहीं करना चाहता था, इसलिए मैंने बदल दिया xrange() करने के लिए। मुझे हमेशा यकीन नहीं है कि यह सर्वोत्तम अभ्यास को प्रोत्साहित करने का एक अच्छा समय है - कभी-कभी _better_ अभ्यास मुझे लगता है कि उपयोगकर्ता फिलहाल समझने के लिए तैयार है। – Triptych

+1

@Triptych: मुझे लगता है कि शुरुआत के लिए सबसे प्राथमिक कार्यों से चिपकना अच्छा विचार था, लेकिन मैं असहमत हूं कि xrange पेश करना महत्वपूर्ण है।यह कम से कम अजीब के रूप में अजीब लगता है, और दस्तावेज़ कहते हैं कि रोगजनक मामलों को छोड़कर xrange का लाभ न्यूनतम है। (यह मेरा अनुभव भी रहा है।) और xrange पहले से ही 3.x में वर्तनी रेंज है। –

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