2010-06-10 11 views
7

Supose आप की तरह कुछ है:पायथन में किसी ऑब्जेक्ट के प्रत्येक संदर्भ को कैसे हटाएं?

x = "something" 
b = x 
l = [b] 

आप वस्तु कैसे हटा सकते हैं केवल एक संदर्भ है, एक्स कहा?

del x चाल नहीं करेगा; ऑब्जेक्ट अभी भी बी से पहुंच योग्य है, उदाहरण के लिए।

+3

यह 'ए' कहां है जिसके बारे में आप बात कर रहे हैं? –

+0

क्या आपका मतलब 'x' था? –

+3

आप ऐसा क्यों करना चाहते हैं? – SilentGhost

उत्तर

5

आप नहीं करते हैं। यह पूरा मुद्दा है। कल्पना करें कि l आपके नियंत्रण के बाहर लाइब्रेरी में है। यह उम्मीद करने का हर अधिकार है कि संग्रह तत्व असंतुष्ट नहीं होते हैं।

इसके अलावा, कल्पना करें कि यह अन्यथा था या नहीं। आपके यहां SO प्रश्न होंगे "मैं दूसरों को अपनी वस्तुओं को हटाने से कैसे रोकूं?"। एक भाषा डिजाइनर के रूप में, आप दोनों मांगों को पूरा नहीं कर सकते हैं।

+0

मैं सभी सूची, केवल एक तत्व गायब नहीं होगा। –

+0

विवरण, कोई फर्क नहीं पड़ता। पुस्तकालय वस्तु का संदर्भ रखता है; पाइथन भाषा नियमों के अनुसार यह वस्तु को जीवित रखने के संदर्भ में उस संदर्भ पर भरोसा कर सकता है। – MSalters

11

नहीं, नहीं। पायथन में एक कचरा कलेक्टर है जिसमें बहुत मजबूत क्षेत्र के मुद्दे हैं - यह आपके साथ वस्तुओं को बनाने में गड़बड़ नहीं करेगा, आप वस्तुओं को हटाने के साथ गड़बड़ नहीं करते हैं।

बस शब्दों में कहें, यह नहीं किया जा सकता है, और एक अच्छे कारण के लिए।

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

+0

पॉर्प्यूज यह सुनिश्चित करना है कि ऑब्जेक्ट का फिर से उपयोग नहीं किया जाएगा। –

+1

@ जुआनजो फिर उचित प्रोग्रामेटिक तरीके से ऐसा करें। आपकी ऑब्जेक्ट्स आपको विषय को 'बंद' करने की अनुमति देनी चाहिए, या जो कुछ भी आप करने की कोशिश कर रहे हैं। इसमें कोई जादू शामिल नहीं है। एक फ़ाइल को एक बार बंद करना होगा, इससे कोई फर्क नहीं पड़ता कि कितने कार्यों ने इसे पढ़ा/लिखा है – abyx

+1

@ जुआनजो: तत्व को हटाने से यह सुनिश्चित नहीं होता है कि इसका पुन: उपयोग नहीं किया जाएगा। वास्तव में, यदि इसका पुन: उपयोग किया जाता है, तो आपका प्रोग्राम क्रैश हो जाएगा। अपना कोड बुद्धिमानी से लिखें और उन वस्तुओं का उपयोग न करें जिन्हें आप उपयोग नहीं करना चाहते हैं। –

7

एकमात्र समाधान मैं अभी देखते हैं कि आप यह सुनिश्चित करें कि आप x को केवल संदर्भ के पकड़े हुए हैं बनाना चाहिए है, बाकी सब x ही नहीं मिल चाहिए, लेकिन एक कमजोर संदर्भ x की ओर इशारा करते। कमजोर संदर्भ weakref मॉड्यूल में लागू किया जाता है और आप इसे इस तरह से उपयोग कर सकते हैं:

>>> import weakref 
>>> class TestClass(object): 
...  def bark(self): 
...   print "woof!" 
...  def __del__(self): 
...   print "destructor called" 
... 
>>> x = TestClass() 
>>> b = weakref.proxy(x) 
>>> b 
<weakproxy at 0x7fa44dbddd08; to TestClass at 0x7fa44f9093d0> 
>>> b.bark() 
woof! 
>>> del x 
destructor called 
>>> b.bark() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ReferenceError: weakly-referenced object no longer exists 

हालांकि, ध्यान दें कि सभी वर्गों के कमजोर संदर्भित हो सकता है। विशेष रूप से, अधिकांश अंतर्निर्मित प्रकार नहीं कर सकते हैं। कुछ अंतर्निर्मित प्रकार कमजोर-संदर्भित हो सकते हैं यदि आप उन्हें उपclass (जैसे dict), लेकिन अन्य नहीं कर सकते (जैसे int)।

+0

str के बारे में क्या? –

+1

'str' कमजोर नहीं हो सकता है-संदर्भित, भले ही आप इसे उपclass न करें। कमजोर संदर्भ वाले तारों कीड़े की एक बड़ी संख्या खुल जाएगी; उदाहरण के लिए, पाइथन दुभाषिया एक स्ट्रिंग ऑब्जेक्ट को "इंटर्न" चुन सकता है और इसे स्मृति में चारों ओर रख सकता है भले ही उम्मीद में कोई संदर्भ न हो कि बाद में यह उपयोगी हो।आम तौर पर दुभाषिया छोटे तारों और पूर्णांक के साथ ऐसा करता है, लेकिन आप 'intern' अंतर्निहित (कम से कम पायथन 2.x) के साथ एक स्ट्रिंग को प्रशिक्षित करना भी चुन सकते हैं। –

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