2012-04-12 17 views
7

संभव डुप्लिकेट:
“Least Astonishment” in Python: The Mutable Default Argumentअजगर वर्ग निर्माता

किसी को भी निम्नलिखित अजीब व्यवहार की व्याख्या कर सकते हैं?

मैं निम्नलिखित वर्ग है:

class Zoo: 
    def __init__(self,alist=[]): 
     self.animals = alist 

    def __len__(self): 
     return len(self.animals) 

    def add(self,a): 
     self.animals.append(a) 

और जब मैं निम्नलिखित करते हैं,

In [38]: z=Zoo() 
In [39]: z.add(2) 
In [40]: z.add(23) 
In [41]: len(z) 
Out[41]: 2 

In [42]: z2=Zoo() 

In [43]: len(z2) 
Out[43]: 2 

क्यों z2.animals नहीं एक खाली सूची है?

धन्यवाद, मथायस

+2

शायद वह नहीं जानता था कि क्या खोजा जाए? कभी-कभी सही खोज शब्दों के साथ आना मुश्किल होता है, यदि आप शर्तों को नहीं जानते हैं। – hopla

उत्तर

11

आप अपने निर्माता में डिफ़ॉल्ट तर्क परिवर्तनशील कर रहे हैं (आप बस अपने उदाहरणों में से प्रत्येक में एक ही सूची के लिए एक संदर्भ कॉपी कर रहे हैं)। इस प्रकार आप इसे ठीक कर सकते हैं:

class Zoo: 
    def __init__(self,alist=None): 
     self.animals = alist or [] 

    def __len__(self): 
     return len(self.animals) 

    def add(self,a): 
     self.animals.append(a) 
4

डिफ़ॉल्ट तर्क सूची सभी उदाहरणों के लिए एक ही वस्तु है, इसलिए एक सदस्य को यह बताए सिर्फ एक ही वस्तु के लिए एक संदर्भ प्रदान करती है।

>>> class foo(): 
... def __init__(self, x = []): 
...  print id(x) 
... 
>>> x = foo() 
140284337344168 
>>> y = foo() 
140284337344168 
>>> z = foo() 
140284337344168 

आप देख सकते हैं कि x सभी उदाहरणों में एक ही वस्तु है:

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

+0

एक भ्रमित और आम गलतफहमी का महान चित्रण! –

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