2012-12-31 35 views
6

पायथन 2.7.1 में, मैं संदेशों की एक सूची को पहली तर्क के रूप में और दूसरी तर्क के रूप में रंगों की एक सूची प्रदान करने की कोशिश कर रहा हूं। मैं दूसरे तर्क को गोरे की सूची में डिफ़ॉल्ट रूप से चाहता हूं यदि यह उपलब्ध नहीं है। इस तरह से मैं यह करने की कोशिश की है:फ़ंक्शन तर्कों में सूची समझ

def multicolor_message(msgs, colors=[libtcod.white for x in len(msgs)]): 
#function body 

libtcod.white पुस्तकालय मैं उपयोग कर रहा हूँ और कोई रास्ता नहीं है किसी भी समस्याओं के कारण में है का एक हिस्सा है। कंपाइलर का कहना है कि चर msgs परिभाषित नहीं है। स्पष्ट रूप से msgs चर इस दायरे में मौजूद नहीं है, लेकिन मुझे उचित लंबाई की एक सूची बनाने और इसे colors पर असाइन करने की आवश्यकता है। ऐसा करने का सबसे साफ तरीका क्या है?

+0

आप स्टैकट्रेस/त्रुटि संदेश प्रदान करना चाहिए –

+1

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

+0

@InbarRose इस मामले स्टैकट्रेस में क्या गलत – piokuc

उत्तर

6

मैं इस तरह यह करना होगा:

def multicolor_message(msgs, colors=None): 
    if colors is None: 
    colors=[libtcod.white for x in len(msgs)] 
+4

है और इस तरह से करने के लिए कारण यह है कि आप मूलभूत मूल्यों में एक ही समारोह की अन्य तर्कों संदर्भ नहीं दे सकता है देखने के लिए आवश्यक नहीं था। फ़ंक्शन के परिभाषित दायरे में डिफ़ॉल्ट मानों का मूल्यांकन किया जाता है, और फ़ंक्शन कहने के बाद तर्क स्वयं ही मौजूद होते हैं। –

+0

@MattiVirkkunen यह सही है। – piokuc

+2

एक और महत्वपूर्ण कारण है कि [परिवर्तनशील डिफ़ॉल्ट तर्क] (http://stackoverflow.com/q/1132941/395760) शायद ही कभी तुम क्या चाहते हो। – delnan

4

संभव नहीं है यही कारण है, अजगर के रूप में समारोह के डिफ़ॉल्ट तर्क समारोह परिभाषा समय में क्रियान्वित कर रहे हैं और अपने msgs चर उपलब्ध समारोह कहा जाता है जब तक नहीं होगा।

docs से

:

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

def whats_on_the_telly(penguin=None): 
    if penguin is None: 
     penguin = [] 
    penguin.append("property of the zoo") 
    return penguin 
+0

संकलन समय पर नहीं। फ़ंक्शन परिभाषा समय पर। अंतर नेस्टेड फ़ंक्शंस के लिए महत्वपूर्ण है, या जब अभिव्यक्तियों में मॉड्यूल-स्तरीय नामों का उपयोग किया जाता है। – delnan

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

  • कोई संबंधित समस्या नहीं^_^