2010-05-03 6 views
7

मैंने एक वर्ग बनाया:एक पायथन कक्षा में सूची एक ही वस्तु को 2 अलग-अलग उदाहरणों से साझा करती है?

class A: 
    aList = [] 

अब मेरे पास यह कार्य है जो इस कक्षा को तुरंत चालू करता है और आइटम को सूची में जोड़ता है।

नोट: 2 आइटम

for item in items: 
    a = A(); 
    a.aList.append(item); 

मुझे लगता है कि पहले ए और दूसरे ए ऑब्जेक्ट में उनकी सूची में आइटम की संख्या समान है। मैं उम्मीद करता हूं कि पहले ऑब्जेक्ट की सूची में पहली वस्तु होगी और दूसरी ऑब्जेक्ट में उसकी सूची में दूसरा आइटम होगा।

क्या कोई यह समझा सकता है कि यह कैसे होता है?

PS:

मैं एक निर्माता के अंदर एक सूची को स्थानांतरित करके इस समस्या को हल करने का प्रबंधन करता हूं:

def __init__(self): 
    self.aList = []; 

लेकिन मैं अभी भी इस व्यवहार के बारे में उत्सुक हूं

+0

मैं ऊपर दिए गए आपके कोड में देख सकता हूं, आप 'ए' को असाइन कर रहे हैं, ए की सामग्री यह मान लेगी कि 'ए' सामग्री ए के समान होगी, है ना? –

+0

संभावित डुप्लिकेट [मैं उदाहरणों के बीच पाइथन क्लास डेटा साझा करने से कैसे बचूं?] (Http://stackoverflow.com/questions/1680528/how-do-i-avoid-having-python-class-data-shared-among -इंसेन्स) –

उत्तर

9

तुम एक वर्ग विशेषता के रूप में सूची को परिभाषित किया है।

कक्षा गुण आपके वर्ग के सभी उदाहरणों द्वारा साझा कर रहे हैं। आप __init__self.aList के रूप में सूची जब परिभाषित करते हैं, तो सूची अपने उदाहरण की एक विशेषता (स्वयं) है और फिर सब कुछ काम करता है के रूप में आप की उम्मीद है।

3

आप कर रहे हैं भ्रामक वर्ग और चर आपत्ति ।

यदि आप चाहते हैं वस्तुओं:

class A(object): 
    def __init__(self): 
     self.aList = [] 
अपने उदाहरण alist में

एक वर्ग चर, आप अन्य भाषाओं में 'स्थिर' कीवर्ड का उपयोग कर के साथ तुलना कर सकते हैं। पाठ्यक्रम के वर्ग चर सभी मामलों में साझा किया जाता है।

+0

इसे इंगित करने के लिए धन्यवाद। मैं जावा पृष्ठभूमि से आया हूं जहां हमारे पास स्थैतिक चर के लिए 'स्थैतिक' कीवर्ड है। अब मैं इसके पीछे तर्क समझता हूं। चीयर्स =) – zfranciscus

0

अजगर में, चर वर्ग परिभाषा अंदर की घोषणा की, के बजाय एक विधि के अंदर, वर्ग या स्थिर चर हैं। आपको this answer to another question पर नज़र रखने में रुचि हो सकती है।

0

ऐसा इसलिए हुआ क्योंकि सूची एक परिवर्तनशील वस्तु है, और यह केवल एक बार जब वर्ग को परिभाषित करने, यही वजह है कि यह साझा हो जाता है जब आप दो उदाहरण बना बनाया जाता है। उदाहरण के लिए,

class A: 
    a = 0 #immutable 
    b = [0] #mutable 

a = A() 
a.a = 1 
a.b[0] = 1 

b = A() 
print b.a #print 0 
print b.b[0] #print 1, affected by object "a" 

इसलिए, समस्या को हल करने के लिए, हम आपके द्वारा वर्णित कन्स्ट्रक्टर का उपयोग कर सकते हैं। जब हम सूची को कन्स्ट्रक्टर में डालते हैं, जब भी ऑब्जेक्ट तत्काल होता है, तो नई सूची भी बनाई जाएगी।

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