2011-04-19 15 views
24

यहां एक फ़ंक्शन है। मेरा इरादा कीवर्ड तर्क डिफ़ॉल्ट का उपयोग करना है ताकि शब्दकोश को खाली नहीं किया जा सके।पाइथन फ़ंक्शन में कीवर्ड तर्क के लिए डिफ़ॉल्ट मान के रूप में खाली शब्दकोश: शब्दकोश को बाद में कॉल पर {} में प्रारंभ नहीं किया गया है?

>>> def f(i, d={}, x=3) : 
...  d[i] = i*i 
...  x += i 
...  return x, d 
... 
>>> f(2) 
(5, {2: 4}) 

लेकिन जब मैं अगली कॉल च, मैं मिलता है:

>>> f(3) 
(6, {2: 4, 3: 9}) 

ऐसा लगता है कि दूसरी कॉल में कीवर्ड तर्क घ एक खाली शब्दकोश को इंगित नहीं करता है, लेकिन बल्कि यह रूप में शब्दकोश में पिछली कॉल के अंत में छोड़ा गया था। संख्या x प्रत्येक कॉल पर तीन पर रीसेट कर दिया गया है।

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

तो नाम डी द्वारा इंगित स्थानीय मूल्य हटा दिया जाना चाहिए, और अगली कॉल पर, यदि मैं कीवर्ड तर्क डी की आपूर्ति नहीं करता हूं, तो डी default {} पर सेट किया जाना चाहिए। लेकिन जैसा कि आप देख सकते हैं, डी को उस शब्दकोश में सेट किया जा रहा है जो पिछली कॉल में इंगित करता है।

क्या चल रहा है?

literal {} संलग्नक क्षेत्र में डीफ़ लाइन में है?

यह व्यवहार 2.5, 2.6 और 3.1 में देखा गया है।

+1

एक ठेठ अजगर पकड़ लिया है कि: [समारोह/विधि तर्क के लिए परिवर्त्य चूक] (http://pythonconquerstheuniverse.wordpress.com/category/python-gotchas/) –

उत्तर

2
>>> def f(i, d=None, x=3): 
...  if not d: 
...   d={} 
...  d[i] = i*i 
...  x += i 
...  return x,d 
... 
>>> f(2) 
(5, {2: 4}) 
>>> f(3) 
(6, {3: 9}) 
>>> 
+1

हम इसे घ के रूप में परिभाषित कर सकते हैं = घ या {}। –