2013-09-05 23 views
6

मुझे एक छोटी सी समस्या है जिसे मैं समझ नहीं पा रहा हूं।पायथन - यह ऑब्जेक्ट का नया उदाहरण क्यों नहीं बनाता है?

def appendMethod(self, newInstance = someObject()): 
    self.someList.append(newInstace) 

मैं विशेषताओं के बिना इस विधि कॉल:

object.appendMethod() 

और वास्तव में मैं someObject का एक ही उदाहरण के साथ इस सूची संलग्न

मैं एक विधि है।

लेकिन अगर मैं इसे करने के लिए बदलने के लिए:

def appendMethod(self): 
    newInstace = someObject() 
    self.someList.append(newInstance) 

मैं उस वस्तु की नया उदाहरण हर बार मिलता है, क्या फर्क है?

यहाँ एक उदाहरण है:

class someClass(): 
    myVal = 0 

class otherClass1(): 

    someList = [] 

    def appendList(self): 
     new = someClass() 
     self.someList.append(new) 

class otherClass2(): 

    someList = [] 

    def appendList(self, new = someClass()): 
     self.someList.append(new) 

newObject = otherClass1() 
newObject.appendList() 
newObject.appendList() 
print newObject.someList[0] is newObject.someList[1] 
>>>False 

anotherObject = otherClass2() 
anotherObject.appendList() 
anotherObject.appendList() 
print anotherObject.someList[0] is anotherObject.someList[1] 
>>>True 
+0

इस सवाल * सख्ती से * परिवर्तनशील डिफ़ॉल्ट मान से संबंधित नहीं है, लेकिन के बारे में * जब * मूलभूत मूल्यों बनाई गई हैं है। @tomek ध्यान रखें कि प्रत्येक कार्य '__defaults__' विशेषता में अपने डिफ़ॉल्ट मानों का **' tuple' ** रखता है। लेकिन इसका क्या मतलब है? ठीक है, निश्चित रूप से के बाद से 'tuple's अपरिवर्तनीय कार्य हैं * नहीं कर सकते हैं * एक डिफ़ॉल्ट मान हर बार उन्हें कहा जाता है बनाते हैं, इसलिए डिफ़ॉल्ट मान समारोह * परिभाषा पर केवल * एक बार * बनाई गई है *। 'someObject' तरह' डीईएफ़ समारोह() एक समारोह के साथ बदलने के लिए प्रयास करें: प्रिंट ("कहा जाता है") 'और देखते हैं कि यह समारोह कहा जाता हो जाता है जब। – Bakuriu

+0

यह एक अच्छा सवाल है। यह निश्चित रूप से मुझे उलझन में आया जब मैं सी ++ से आया - भूमि जहां कार्य द्वितीय श्रेणी की वस्तुओं को फ़ंक्शन परिभाषा के बजाय फ़ंक्शन निष्पादन पर मूल्यांकन किया जाता है। – Shashank

उत्तर

2

इसका कारण यह है कि आप एक परिवर्तनशील वस्तु के रूप में अपने डिफ़ॉल्ट तर्क बताए जाते हैं।

पायथन में, एक फ़ंक्शन एक ऑब्जेक्ट होता है जिसे परिभाषित होने पर मूल्यांकन किया जाता है, इसलिए जब आप def appendList(self, new = someClass()) टाइप करते हैं तो आप new को फ़ंक्शन के सदस्य ऑब्जेक्ट के रूप में परिभाषित कर रहे हैं, और इसे निष्पादन समय पर फिर से मूल्यांकन नहीं किया जाता है।

देख “Least Astonishment” in Python: The Mutable Default Argument

+0

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

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