2011-08-26 13 views
6

मुझे पाइथन में map फ़ंक्शन के बारे में कोई प्रश्न है।पायथन नक्शा समारोह, संदर्भ/मूल्य से गुजर रहा है?

जो मैं समझता हूं उससे, फ़ंक्शन उस सूची को म्यूटेट नहीं करता है जिस पर यह चल रहा है, बल्कि एक नया बनाएं और इसे वापस कर दें। क्या ये सही है ?

साथ ही, मैं कोड का निम्न भाग है

def reflect(p,dir): 
    if(dir == 'X'): 
    func = lambda (a,b) : (a * -1, b) 
    else: 
    func = lambda (a,b) : (a, b * -1) 
    p = map(func,p) 
    print 'got', p 

points जैसे tuples की एक सरणी है: [(1, 1), (-1, 1), (-1, -1), (1, -1)]

अगर मैं इस तरीके से ऊपर फ़ंक्शन को कॉल करें:

print points 
reflect(points,'X') 
print points 

सूची points नहीं बदली है। हालांकि फ़ंक्शन के अंदर, प्रिंट फ़ंक्शन ठीक से प्रिंट करता है जो मैं चाहता हूं।

क्या कोई मुझे किसी दिशा में इंगित कर सकता है जहां मैं सीख सकता हूं कि यह सब मूल्य/संदर्भ आदि द्वारा गुजर रहा है, और मैं उपरोक्त को कैसे ठीक कर सकता हूं? या हो सकता है मैं अजगर में हास्केल अनुकरण करने के लिए ...

धन्यवाद

बहुत कठिन कोशिश कर रहा हूँ

संपादित करें:

p = map(func,p) के बजाय कहते हैं मैं

for i in range(len(p)): 
    p[i] = func(p[i]) 

सूची का मूल्य है फ़ंक्शन के बाहर अपडेट किया गया है, जैसे कि संदर्भ द्वारा काम करना। उह, उम्मीद है कि यह स्पष्ट है: एस

+0

क्या आप थोड़ा और स्पष्ट कर सकते हैं कि आपका प्रश्न/समस्या क्या है? हास्केल का संदर्भ गैर-हास्केल-प्रोग्रामर के लिए बहुत उपयोगी नहीं है। – Achim

+0

अरे।हाँ, इसके लिए खेद है, शायद हैकेल टिप्पणी को अनदेखा करें। मैं बस आश्चर्यचकित हूं कि भले ही मैं 'p = map (func, p)' करता हूं, सूची पी को फ़ंक्शन के बाहर नहीं बदला जाता है। यदि मैं एक सूची पुनरावृत्ति के साथ 'p = map (func, p) 'को प्रतिस्थापित करता हूं, तो ऐसा लगता है कि यह काम करता है। – rafalio

+0

पायथन न तो मूल्य से गुजरता है और न ही संदर्भ द्वारा पास होता है, अजगर वस्तु द्वारा पारित किया जाता है। –

उत्तर

12

आप गलत समझते हैं कि पाइथन में संदर्भ कैसे काम करते हैं। यहां, सभी नाम संदर्भ हैं, कोई "मान" नहीं हैं। नाम वस्तुओं के लिए बाध्य हैं। - लेकिन = उद्देश्य यह है कि नाम से की ओर इशारा किया है संशोधित नहीं करता है यह एक अलग वस्तु के नाम rebinds:

x = 42 
y = x 
# now: 
# 'is' is a identity operator — it checks whether two names point to the 
# exact same object 
print x is y # => True 
print x, y # 42 42 
y = 69 
# now y has been rebound, but that does not change the '42' object, nor rebinds x 
print x is y # => False 
print x, y # 42 69 

वस्तु ही संशोधित करने के लिए यह परिवर्तनशील होने की जरूरत है - यानी सदस्यों को बताया कि यह उत्परिवर्तित बेनकाब या एक संशोधित निर्देश है। उपर्युक्त जैसा ही होता है जब आप p को पुन: जोड़ते हैं - यह points को स्पर्श नहीं करता है, यह बस स्थानीय p नाम के अर्थ को संशोधित करता है।

यदि आप सी ++ - जैसे संदर्भों को अनुकरण करना चाहते हैं, तो आपको ऑब्जेक्ट को एक परिवर्तनीय कंटेनर में समाहित करने की आवश्यकता है, उदा। एक सूचि।

reflect([points], 'X') 

# inside reflect: 
p[0] = ... 

लेकिन आपको कम से कम इस मामले में नहीं करना चाहिए - आपको इसके बजाय नई वस्तु वापस करनी चाहिए।

points = reflect(points, 'X') 

# inside reflect, instead of p = ... 
return map(func, p) 

खैर, अब मैं इसके बारे में लगता है कि, आप भी

p[:] = map(func, p) 

लेकिन फिर, नई वस्तु लौटने आमतौर पर बेहतर है कर सकते हैं।

+0

आह ठीक है, यह समझ में आता है। मैं उलझन में था और सोचा था कि '=' ऑपरेटर इससे अलग काम करता है, धन्यवाद। – rafalio

0

अजगर के डाटा मॉडल एक त्रयी पर आधारित है:
पहचानकर्ता - संदर्भ - वस्तु

  • पहचानकर्ता कोड में लिखा गया string है।
  • संदर्भ एक चर stricto sensu, कि कहने के लिए "जिनकी सामग्री स्मृति का एक हिस्सा बदल सकते हैं" है। संदर्भ का मान ऑब्जेक्ट का पता है।
  • वस्तु एक कार्यान्वयन langage सी अजगर की नींव है कि की संरचना पर आधारित है।

अन्य शब्द भी 'पहचानकर्ता' नामित करने के लिए उपयोग किया जाता है:
1) नाम
2) चर; क्योंकि इस शब्द का प्रयोग गणित में मेटोनोमी द्वारा वास्तविक गणितीय चर का प्रतिनिधित्व करने वाले प्रतीकों को निर्दिष्ट करने के लिए किया जाता है, और कंप्यूटर में चर के रूप में वैचारिक रूप से गणितीय चर (उनके मान बदल सकते हैं) के समान कार्यशील होते हैं।
पायथन में यह उपयोग मेरी राय में एक बहुत ही बुरी आदत है: यह अस्पष्टता और भ्रम पैदा करता है जिसे कंप्यूटर विज्ञान में 'चर' कहा जाता है: "स्मृति की कमी जिसका सामग्री बदल सकती है"। पहचानकर्ता

:

सबसे अच्छा शब्द का उपयोग किया जा सके।

एक पहचानकर्ता और एक वस्तु किसी निश्चित नामस्थान में बाध्य होती है। नामस्थान पाइथन के शब्दकोशों के रूप में प्रदर्शित होते हैं, लेकिन वे शब्दकोश नहीं हैं।

  • पहचानकर्ता के बंधन और वस्तु अप्रत्यक्ष है, संदर्भ के माध्यम से।

  • पहचानकर्ता का बाध्यकारी और संदर्भ प्रत्यक्ष है, और SYMBOL तालिका (या प्रतीक-तालिका) में महसूस किया गया है।

कंप्यूटर विज्ञान में, एक प्रतीक तालिका इस तरह के एक संकलक या दुभाषिया, जहां एक कार्यक्रम के स्रोत कोड में प्रत्येक पहचानकर्ता जानकारी से संबंधित साथ जुड़ा हुआ है के रूप में एक भाषा अनुवादक द्वारा इस्तेमाल किया डेटा संरचना है इसके स्रोत में घोषणा या उपस्थिति, जैसे प्रकार, दायरा स्तर और कभी-कभी इसका स्थान।
http://en.wikipedia.org/wiki/Symbol_table

वे कहते हैं: पहचानकर्ता। ठीक।
मुझे शायद ही कभी प्रतीक तालिका में संकेत मिलते हैं, हालांकि यह महत्वपूर्ण बात है जो पायथन के डेटा मॉडल आईएमओ के कामकाज पर प्रकाश डालती है।

मेरी राय में, शब्द

बाध्यकारी

एक सटीक और अद्वितीय तंत्र लेकिन विश्व स्तर पर सभी त्रयी पहचानकर्ता के विषय में तंत्र के सेट को नामित नहीं करता है - संदर्भ - वस्तु

मैं यह नहीं दिखाता कि मैं पाइथन के डेटा और निष्पादन मॉडल से संबंधित सभी मामलों को पूरी तरह से समझता हूं, और उपर्युक्त विचार अधिक सटीक और सटीक व्यक्त किए जाते हैं जो किया जा सकता है।
हालांकि, वे मुझे कोड के निष्पादन के दौरान क्या होता है इसकी परिचालन समझने की अनुमति देते हैं।
यदि मैं गलत हूं तो मुझे कुछ बिंदुओं पर सही होने के लिए बहुत खुशी होगी (उदाहरण के लिए, मैं माइकल फॉर्ड से सीखा है कि नामस्थानों की प्रकृति शब्दकोश नहीं है, जो कि उनका प्रतिनिधित्व किया जाता है)

उस ने कहा, मुझे नहीं पता कि मूल्य और संदर्भ कहलाता है जब पाइथन में तर्क के रूप में कुछ गुजरने का विषय चर्चा की जाती है, और मुझे लगता है कि कई व्यक्तियों ने इस विषय पर कई लोगों को व्यक्त किया है गूढ़ चर्चाएं मुझसे ज्यादा नहीं जानती हैं। मुझे लगता है कि इस विषय पर कोई सबसे अच्छा और स्पष्ट राय है कि एलेक्स मार्टेली में से एक यह है कि:

चर एक भाषा के लिए बॉक्स "आर" कि अधिक आम तौर पर भाषाओं जहां पर लागू होता है शब्दावली का पुन: उपयोग करने के लिए कोशिश कर रहा है " जहां "चर पोस्ट-टैग टैग हैं", आईएमएचओ, मदद से भ्रमित होने की अधिक संभावना है। "

एलेक्स मार्टेली

http://bytes.com/topic/python/answers/37219-value-reference

+0

अपने मॉडरेटर ध्वज के जवाब में, केवल प्रश्नों में टैग हो सकते हैं। उत्तर में स्वचालित रूप से वही टैग होता है (प्रदर्शित नहीं होता) जैसा कि वे उत्तर देते हैं। –

+0

@ बिलकुल बिलकुल धन्यवाद। मुझे एहसास हुआ कि कुछ समय बाद। आपका जवाब दिलचस्प है, क्योंकि आप कहते हैं कि उत्तर भी प्रश्न के समान ही टैग किए जाते हैं, हालांकि टैग प्रदर्शित नहीं होता है। यह कुछ ऐसा था जो मैं सोच रहा था: जब हम टैग के साथ खोज करते हैं तो क्या होता है? अब मुझे पता है कि टैग्स को ध्यान में रखा जाता है क्योंकि उत्तरों को टैग किया जाता है। – eyquem

0

मैं इस टक्कर करना चाहते हैं। जवाब वास्तव में सवाल का जवाब नहीं देते हैं - वे इस तथ्य की उपेक्षा करते हैं कि ओपी पुनरावृत्ति द्वारा वांछित परिणाम प्राप्त करने में सक्षम था। प्रश्न map के व्यवहार के लिए आता है।

f=(lambda pair: pair[0].append(pair[1])) 
a = ([],1) 
f(a) 
print(a) #prints ([1],1) 
a=([],1) 
map(f,[a]) 
print(a) #prints ([0],1) 

रास्ता ओपी उम्मीद कर रही है में तो नक्शा परिवर्तनशील नहीं है वस्तुओं: यहाँ एक और अधिक प्रत्यक्ष उदाहरण है। मेरे पास एक ही भ्रम है।

क्या कोई यहां पर क्या हो रहा है इस पर टिप्पणी कर सकता है? मुझे लगता है कि ओपी के सवाल का अच्छा जवाब होगा।

ध्यान दें कि हम अलग व्यवहार कर अगर हम map के उत्पादन में इस प्रकार आवंटित (प्रति बिल्ली प्लस प्लस 'जवाब के रूप में)

f=(lambda pair: pair[0].append(pair[1])) 
a = ([],1) 
x = [a] 
x[:] = map(f,x) 
print(x) #prints None 
print(a) # prints [1] 

कृपया ध्यान दें कि पहले उदाहरण में, हम बस f(a) कहा जाता है, नहीं a=f(a)map का उपयोग करते समय हमें map के बाहर काम करते समय असाइनमेंट की आवश्यकता क्यों है?

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