2012-03-15 12 views
5

मैं पाइथन संदर्भ के साथ उलझन में हूं। निम्न उदाहरण पर विचार करें:पायथन काम का संदर्भ कैसे देता है?

मेरे काम: सूची

d = { 'm': [1,2,3] } 
m = d['m'] 
m = m[1:] # m changes its reference to the new sliced list, edits m but not d (I wanted to change d) 

इसी में प्रत्येक तत्व संपादित करने के लिए:

d = { 'm': [1,2,3] } 
m = d['m'] 
m = m[0] # As per python referencing, m should be pointing to d['m'] and should have edited d 

अजगर में सब कुछ संदर्भ से भी जाना जाता है, तो जब एक नई वस्तु है बनाया था? क्या हमें ऑब्जेक्ट प्रतियों को बनाने के लिए copy मॉड्यूल से हमेशा copy और deepcopy की आवश्यकता है?

कृपया स्पष्ट करें।

+1

आप एक दृश्य शिक्षार्थी रहे हैं, [यहाँ है] (http://people.csail.mit.edu/pgbovine/python मतलब होगा /) एक अच्छा ट्यूटोरियल – forivall

+0

बेहद सहायक टिप्पणी श्री @ jordoex - गंभीर रूप से बहुत बढ़िया! –

उत्तर

11

पायथन में एक चर एक बॉक्स नहीं है जो चीजें रखता है, यह एक ऐसा नाम है जो किसी ऑब्जेक्ट को इंगित करता है। अपने कोड में:

  • d = { 'm': [1,2,3] } -> एक शब्दकोश में नाम d बांधता
  • m = d['m'] -> एक और सूची
  • के नाम m बांधता है -> एक सूची में नाम m बांधता
  • m = m[1:]

आपकी तीसरी पंक्ति m स्वयं नहीं बदल रही है, लेकिन m क्या इंगित कर रहा है।

सूची में तत्वों संपादित करने के लिए आप क्या कर सकते है:

m = d['m'] 
for i, item in enumerate(m): 
    result = do_something_with(item) 
    m[i] = result 
+0

क्या इस सूची के प्रत्येक तत्व को 'enumerate' के अलावा संपादित करने का कोई अन्य तरीका है? –

+0

"एक ऑब्जेक्ट को इंगित करने वाला नाम" भ्रमित हो सकता है, क्योंकि "पॉइंटर" पायथन शब्दावली नहीं है। मैं बस कहूंगा "यह किसी ऑब्जेक्ट का नाम है"। –

+0

"आपकी तीसरी पंक्ति एम स्वयं को नहीं बदल रही है, लेकिन क्या एम इंगित कर रहा है" पाठक के लिए थोड़ा अस्पष्ट हो सकता है। अधिक स्पष्ट होने के लिए: "तीसरी पंक्ति किसी अन्य चीज ([2,3]) को इंगित करने के लिए एम को इंगित करने से एक चीज (डी ['एम']) में बदलती है।" –

5

Ethan Furman बताया गया हो कि अजगर आंतरिक काम का एक बहुत अच्छा काम किया है, मैं इसे दोहराना नहीं होगा।

चूंकि m वास्तव में शब्दकोश के अंदर सूची का प्रतिनिधित्व करता है, तो आप इसे संशोधित कर सकते हैं। आप इसे किसी नए चीज़ पर पुन: असाइन नहीं कर सकते हैं, जो तब होता है जब आप = का उपयोग एक नए टुकड़े के बराबर करने के लिए करते हैं।

उदाहरण के लिए सूची के पहले तत्व बंद काट करने के लिए:

>>> m[0:1] = [] 
>>> d 
{'m': [2, 3]} 
+4

मुझे डाउनवॉट्स द्वारा ड्राइव से नफरत है, अगर मैंने कुछ गलत किया तो मुझे पता लगाना क्यों पसंद है। यह उत्तर पाइथन 2.7 में एक अनुशंसित मुहावरे का उपयोग करके परीक्षण किया गया है: http://docs.python.org/library/stdtypes.html#mutable-sequence-types –

+0

मुझे लगता है कि यह एक अच्छी अंतर्दृष्टि मार्क है, और मुझे नहीं पता कि क्यों यह डाउनवॉट किया गया था ... –

+2

किसी सूची से आइटम या स्लाइस हटाने के लिए मैं आमतौर पर अधिक स्पष्ट 'del m [0] 'पसंद करता हूं। बेशक यह एक स्टाइलिस्ट वरीयता है, और मुझे नहीं पता कि किसी ने क्यों गिराया। मेरा अनुमान है कि उनमें से कई यादृच्छिक डाउनवॉट्स स्मार्टफोन के बहुत छोटे डिस्प्ले से परिणाम देते हैं। –

4

अजगर सब कुछ संदर्भ से भी जाना जाता

अजगर में, सब कुछ एक संदर्भ है, और संदर्भ मूल्य से चारों ओर पारित हो जाओ।

यदि आप उन शर्तों का उपयोग करना चाहते हैं। लेकिन वे शब्द चीजों को समझने में कठोर बनाते हैं।

बहुत आसान: पायथन में, एक चर एक ऑब्जेक्ट का नाम है। = का उपयोग उस वस्तु को बदलने के लिए किया जाता है जिसका नाम किसी नाम से संदर्भित होता है। बाएं हाथ की ओर एक मौजूदा वस्तु के हिस्से को संदर्भित कर सकते हैं, इस मामले में उस वस्तु को बदलकर पूरी वस्तु बदल दी जाती है। ऐसा इसलिए है क्योंकि ऑब्जेक्ट, बदले में, वास्तव में इसके हिस्सों को नहीं रखता है, बल्कि इसके बजाय अधिक नाम होते हैं, जो विभिन्न चीजों का जिक्र करना शुरू कर सकते हैं।

तो जब एक नई वस्तु बनाई गई है?

ऑब्जेक्ट (वर्ग निर्माता का उपयोग करके, या एक शाब्दिक को लिखकर निर्मित प्रकार एक शाब्दिक प्रतिनिधित्व है, के मामले में) बनाई गई हैं, जब वे बनाए गए हैं। मुझे समझ में नहीं आता कि यह आपके शेष प्रश्न के लिए प्रासंगिक है।

m = m[1:] # m changes its reference to the new sliced list 

हां, ज़ाहिर है। अब mm[1:] का मूल्यांकन करने के परिणाम को संदर्भित करता है।

edits m but not d (I wanted to change d) 

हां, ज़ाहिर है। यह d बदल जाएगा? यह किसी प्रकार का जादू नहीं था, यह केवल d['m'] का मूल्यांकन करने का परिणाम था। बिल्कुल वही बात दोनों पंक्तियों पर होती है। एक सरल उदाहरण पर

आइए नज़र।

m = 1 
m = 2 

इस कारण 12 बनने के लिए करता है? नहीं बिलकुल नहीं। इंटीजर अपरिवर्तनीय हैं। लेकिन वही बात हो रही है: m एक चीज़ का नाम है, और फिर किसी अन्य चीज़ का नाम है।

या, एक और तरीका है: यदि "संदर्भ" जिस तरह से आप उम्मीद कर काम करने के लिए थे, तो लाइन m = m[1:] पुनरावर्ती होगा। आप इसकी अपेक्षा कर रहे हैं "कहीं भी आप m देखते हैं, इसका इलाज करें जैसे कि इसका मतलब m[1:]" है। ठीक है, उस स्थिति में, m[1:] वास्तव में m[1:][1:] है, जो तब m[1:][1:][1:] का मतलब होगा, आदि

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