2011-01-30 16 views
73

किसी तरह नीचे दिए गए नोड कक्षा में, wordlist और adjacencyList चर नोड के सभी उदाहरणों के बीच साझा किया जाता है।अजगर निर्माता और डिफ़ॉल्ट मान

>>> class Node: 
...  def __init__(self, wordList = [], adjacencyList = []): 
...   self.wordList = wordList 
...   self.adjacencyList = adjacencyList 
... 
>>> a = Node() 
>>> b = Node() 
>>> a.wordList.append("hahaha") 
>>> b.wordList 
['hahaha'] 
>>> b.adjacencyList.append("hoho") 
>>> a.adjacencyList 
['hoho'] 

वहाँ किसी भी तरह से मैं निर्माता पैरामीटर के लिए डिफ़ॉल्ट मान (इस मामले में खाली सूची) का उपयोग कर रख सकते हैं, लेकिन अपने स्वयं के wordlist और adjacencyList चर के लिए दोनों ए और बी प्राप्त करने के लिए है?

मैं अजगर 3.1.2 का उपयोग कर रहा हूं।

+1

संभव डुप्लिकेट http://stackoverflow.com/questions/2681243/how-should-i-declare-default-values-for- उदाहरण-चर-इन-अजगर) की –

+0

संभावित डुप्लिकेट [ "कम से कम विस्मय" पायथन में: जो दायरे में परिवर्त्य डिफ़ॉल्ट तर्क है] (http://stackoverflow.com/questions/1132941/least-astonishment-in-python -which-गुंजाइश-है-परिवर्तनशील-default-तर्क-इन) –

उत्तर

91

म्यूटेबल डिफ़ॉल्ट तर्क आमतौर पर जो भी आप चाहते हैं वह नहीं करते हैं। इसके बजाय, इस प्रयास करें:

class Node: 
    def __init__(self, wordList=None, adjacencyList=None): 
     if wordList is None: 
      self.wordList = [] 
     else: 
      self.wordList = wordList 
     if adjacencyList is None: 
      self.adjacencyList = [] 
     else: 
      self.adjacencyList = adjacencyList 
+20

ये भी एक-लाइनर्स हो सकता है: 'self.wordList = wordlist अगर wordlist कोई भी नहीं है कि []', या , थोड़ा कम सुरक्षित, 'self.wordList = wordList या [] '। –

+1

इसे पायथनिक तरीका माना जाता है, लेकिन मैं क्रौसे के तरीके को पसंद करता हूं क्योंकि "विशेष मामले पर्याप्त विशेष नहीं हैं"। –

+0

@ जोश ब्लेचेर स्नाइडर मैं अपनी अंगुली को उस पर नहीं डाल सका, जो पूर्व की तुलना में बाद में कम सुरक्षित बनाता है? – markdsievers

15

मैं कोशिश करेंगे:

self.wordList = list(wordList) 

बजाय एक ही वस्तु को संदर्भित की एक प्रतिलिपि बनाने के लिए यह मजबूर करने के लिए।

+1

सादगी के लिए +1 :) – Hery

23

के उदाहरण देकर स्पष्ट करना यहाँ क्या हो रहा है दो:

Python 3.1.2 (r312:79147, Sep 27 2010, 09:45:41) 
[GCC 4.4.3] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> class Foo: 
...  def __init__(self, x=[]): 
...   x.append(1) 
... 
>>> Foo.__init__.__defaults__ 
([],) 
>>> f = Foo() 
>>> Foo.__init__.__defaults__ 
([1],) 
>>> f2 = Foo() 
>>> Foo.__init__.__defaults__ 
([1, 1],) 

आप देख सकते हैं कि डिफ़ॉल्ट तर्क एक टपल जो सवाल में समारोह की एक विशेषता है में संग्रहीत हैं। इस सवाल में वर्ग के साथ वास्तव में कुछ भी नहीं है और किसी भी समारोह के लिए चला जाता है। पायथन 2 में, विशेषता func.func_defaults होगी।

जैसा कि अन्य पोस्टर ने इंगित किया है, आप शायद None को एक सेंटीनेल मान के रूप में उपयोग करना चाहते हैं और प्रत्येक उदाहरण को अपनी सूची दें।

11
class Node: 
    def __init__(self, wordList=None adjacencyList=None): 
     self.wordList = wordList or [] 
     self.adjacencyList = adjacencyList or [] 
की [मैं कैसे पायथन में उदाहरण चर के लिए डिफ़ॉल्ट मान घोषित करना चाहिए?] (
संबंधित मुद्दे