कब अजगर में डेल उपयोगी है?


374

मैं वास्तव में किसी भी कारण से नहीं सोच सकता कि अजगर को delकीवर्ड की आवश्यकता क्यों है (और अधिकांश भाषाओं में समान कीवर्ड नहीं लगता है)। उदाहरण के लिए, एक वेरिएबल को हटाने के बजाय, कोई Noneइसे असाइन कर सकता है। और जब शब्दकोश से हटाते हैं, तो एक delविधि जोड़ी जा सकती है।

क्या delअजगर में रखने का कोई कारण है , या यह पायथन के पूर्व-कचरा संग्रह दिनों का एक उल्लास है?


46
ऐतिहासिक नोट : पायथन में शुरू से ही कचरा संग्रह था। 2.0 से पहले, पायथन के कचरा कलेक्टर संदर्भ के चक्रों का पता नहीं लगा सके, लेकिन इसका कोई लेना-देना नहीं था del
स्टीवन रंबलस्की

28
@Steven Rumbalksi, यह डेल के साथ कुछ करना है। डेल का उपयोग संदर्भ चक्रों को तोड़ने के लिए किया गया था।
विंस्टन एवर्ट

6
लेकिन delपूर्व-कचरा संग्रह का एक वेस्टेज नहीं है क्योंकि आपके पास हमेशा हो सकता है used = None। यह हमेशा समझ में आता है कि इसके लिए विशिष्ट वाक्यविन्यास है। चूँकि अब हमारे पास बेलनाकार GC है, ऐसे मामले जहाँ आप उपयोग करना चाहते हैं, वे छोटे हैं।
विंस्टन एवर्ट

3
> और अधिकांश भाषाओं में एक समान कीवर्ड नहीं लगता है। अधिकांश कचरा एकत्रित भाषाएं (या केवल इसका उपयोग जीसी को संकेत देने के लिए नहीं करती हैं कि यह एक चर इकट्ठा कर सकता है)। अधिकांश पुरानी भाषा ने किया: - QuickBasic जैसी अच्छी पुरानी बुनियादी भाषाएं ERASE(विशिष्ट चर को मारें ) और CLEAR( सभी चर को मारें )
DrYak

जवाबों:


498

सबसे पहले, आप स्थानीय चरों के अलावा अन्य चीजों को डिलीट कर सकते हैं

del list_item[4]
del dictionary["alpha"]

दोनों स्पष्ट रूप से उपयोगी होना चाहिए। दूसरे, delस्थानीय चर पर उपयोग करने से इरादे स्पष्ट हो जाते हैं। की तुलना करें:

del foo

सेवा

foo = None

मुझे पता है कि इस मामले में del fooइरादा गुंजाइश से दायरे को हटाने का है। यह स्पष्ट नहीं है कि foo = Noneवह कर रहा है। अगर किसी ने foo = Noneमुझे सौंपा है तो मुझे लगता है कि यह मृत कोड था। लेकिन मुझे तुरंत पता है कि कोई ऐसा व्यक्ति जो कोड करने del fooकी कोशिश कर रहा था।


51
+1, हाँ। जब आप कुछ असाइन करते हैं, तो यह बाद में उपयोग करने का इरादा बताता है। मैंने केवल delमेमोरी-इंटेंसिव गणनाओं में वास्तव में उपयोग किया हुआ देखा है , लेकिन जब मैंने इसे देखा तो मुझे तुरंत एहसास हुआ कि यह क्यों आवश्यक है।
detly

17
सूची या शब्दकोश से हटाने के उपयोग-मामले को आसानी से एक विधि के साथ बदला जा सकता है (जैसा कि मैंने प्रश्न में उल्लेख किया है)। मुझे यकीन नहीं है कि मैं सिग्नल के इरादे के उपयोग से सहमत हूंdel (जैसा कि एक टिप्पणी भाषा को जोड़ने के बिना ही कर सकती है), लेकिन मुझे लगता है कि यह सबसे अच्छा जवाब है।
जेसन बेकर

6
@JasonBaker, विधियों पर दी गई। हालांकि एक विधि का उपयोग करके स्लाइस को हटाना और इस तरह से अधिक अजीब होगा। हां, आप टिप्पणी का उपयोग कर सकते हैं। लेकिन मुझे लगता है कि एक बयान का उपयोग करना बेहतर है, फिर भाषा के हिस्से के रूप में एक टिप्पणी।
विंस्टन इर्वर्ट

2
@ जैसनबेकर: यह केवल इरादे के बारे में नहीं है, वे दो वाक्यविन्यास दो बहुत अलग चीजें करते हैं।
पावेल Paमरदा

2
इसे संबंधित डिक्शनरी से हटाकर भी संभाला जाता है। आप len()फ़ंक्शन को उसी तरह विवाद भी कर सकते हैं । यदि यह मामला है, तो राय को राय के रूप में बंद कर दिया गया है या यहां तक ​​कि स्वाद आधारित हो सकता है। पायथन बस तरीकों पर भरोसा करने के बजाय बुनियादी संचालन के लिए आदिम प्रदान करता है।
पावेल Paमरदा

161

वहाँ क्या delकरता है ( पायथन भाषा संदर्भ से ) का यह हिस्सा है :

एक नाम का विलोपन स्थानीय या वैश्विक नामस्थान से उस नाम के बंधन को हटा देता है

Noneएक नाम को सौंपना नामस्थान से नाम के बंधन को नहीं हटाता है।

(मुझे लगता है कि नाम बंधन को हटाना वास्तव में उपयोगी है , इस बारे में कुछ बहस हो सकती है , लेकिन यह एक और सवाल है।)


22
-1 पोस्टर स्पष्ट रूप से पहले से ही यह समझता है, वह पूछ रहा है कि आप एक नाम बंधन को क्यों हटाना चाहते हैं।
विंस्टन एवर्ट

71
@ आइंस्टीन इवर्ट: मुझे यकीन नहीं है कि पोस्टर समझ में आया कि delएक नाम बाध्यकारी को हटा देता है क्योंकि उन्होंने Noneविकल्प के रूप में असाइन करने का सुझाव दिया था ।
स्टीवन रंबलस्की

8
@ सही, पोस्टर स्पष्ट रूप से चर को हटाने (नाम को हटाने) और कोई नहीं असाइन करने के विपरीत है। वह यह नहीं देखता है कि आपको चर को क्यों हटाना चाहिए जब आप किसी को भी असाइन नहीं कर सकते। इसमें एक ही प्रभाव है कि वे उस नाम से पहले जो कुछ भी था उसका संदर्भ जारी करते हैं।
विंस्टन एवर्ट

19
@Winston Ewert: यह मेरे लिए स्पष्ट नहीं है। शायद आपके लिए यह स्पष्ट है कि आप कहते हैं कि उनका "उस प्रभाव में वही है जो पहले उस नाम के लिए बाध्य था।" लेकिन यह (स्पष्ट रूप से?) पूरी कहानी नहीं है कि इसे हटाने के बाद एक नाम का उपयोग करने का प्रयास उठता है NameError। ग्रेग Hewgill यह बहुत भेद करता है। और यह यह भेद है जो पोस्टर को "स्पष्ट रूप से" मुझे स्पष्ट समझ में नहीं आता है कि आपके दावे को बनाता है।
स्टीवन रंबलस्की

9
@ आइंस्टीन इवर्ट मैं सहमत नहीं हूँ। पर काफी कहा। हम दोनों ने अपने मामले बना लिए हैं।
स्टीवन रंबलस्की

44

एक जगह जिसे मैंने delउपयोगी पाया है वह छोरों के लिए बाहरी चर की सफाई कर रहा है :

for x in some_list:
  do(x)
del x

अब आप सुनिश्चित कर सकते हैं कि यदि आप लूप के लिए इसका उपयोग करते हैं तो x अपरिभाषित हो जाएगा।


1
क्या आपकी delलाइन यहाँ इंडेंट होने वाली है (यानी लूप का हिस्सा)?
सैम

11
@ मेम, नहीं, उनका इरादा नहीं है।
user5319825

7
@Sam नहीं, यहाँ विचार यह है कि लूप के अंतिम पुनरावृत्ति (some_list के अंतिम तत्व पर प्रदर्शन (करने के बाद)) के बाद, x कुछ_लिस्ट के अंतिम मूल्य का संदर्भ बना रहेगा। डेल एक्स यह सुनिश्चित करता है कि यह इस तरह से असाइन नहीं किया गया है।
मैथ्यू

12
NameError: name 'x' is not definedसूची खाली होने पर यह कारण होगा ।
वोफ्का

18

एक चर को हटाना किसी को भी सेट करने से अलग है

चर नामों को हटाने के साथ delशायद ही कभी कुछ का उपयोग किया जाता है, लेकिन यह कुछ ऐसा है जो बिना कीवर्ड के तुच्छ रूप से प्राप्त नहीं किया जा सकता है। यदि आप लिखकर एक चर नाम बना सकते हैं a=1, तो यह अच्छा है कि आप इसे हटाकर सैद्धांतिक रूप से इसे पूर्ववत कर सकते हैं।

यह कुछ मामलों में डिबगिंग को आसान बना सकता है क्योंकि हटाए गए चर का उपयोग करने की कोशिश एक NameError उठाएगी।

आप वर्ग उदाहरण विशेषताएँ हटा सकते हैं

अजगर आपको कुछ इस तरह लिखने देता है:

class A(object):
    def set_a(self, a):
        self.a=a
a=A()
a.set_a(3)
if hasattr(a, "a"):
    print("Hallo")

यदि आप गतिशील रूप से वर्ग उदाहरण में विशेषताएँ जोड़ते हैं, तो आप निश्चित रूप से इसे लिखकर पूर्ववत करने में सक्षम होना चाहते हैं

del a.a

16

एक विशिष्ट उदाहरण है कि आपको कब उपयोग करना चाहिए del(अन्य भी हो सकते हैं, लेकिन मैं इस एक हाथ के बारे में जानता हूं) जब आप sys.exc_info()एक अपवाद का निरीक्षण करने के लिए उपयोग कर रहे हों । यह फ़ंक्शन एक टपल लौटाता है, अपवाद का प्रकार जो उठाया गया था, संदेश और एक ट्रेसबैक।

पहले दो मान आमतौर पर एक त्रुटि का निदान करने और उस पर कार्रवाई करने के लिए पर्याप्त होते हैं, लेकिन तीसरे में संपूर्ण कॉल स्टैक होता है जहां अपवाद उठाया गया था और जहां अपवाद पकड़ा गया है। विशेष रूप से, यदि आप कुछ ऐसा करते हैं

try:
    do_evil()
except:
    exc_type, exc_value, tb = sys.exc_info()
    if something(exc_value):
        raise

ट्रेसबैक, tbकॉल स्टैक के स्थानीय लोगों में समाप्त होता है, एक गोलाकार संदर्भ बनाता है जिसे कचरा एकत्र नहीं किया जा सकता है। इस प्रकार, यह करना महत्वपूर्ण है:

try:
    do_evil()
except:
    exc_type, exc_value, tb = sys.exc_info()
    del tb
    if something(exc_value):
        raise

परिपत्र संदर्भ तोड़ने के लिए। कई मामलों में जहां आप कॉल करना चाहते हैं में sys.exc_info()metaclass जादू के साथ की तरह, ट्रैस है ताकि आप यह सुनिश्चित करें कि आप इसे साफ करने से पहले आप संभवतः अपवाद संचालक छोड़ सकते हैं बनाने के लिए है, उपयोगी। यदि आपको ट्रेसबैक की आवश्यकता नहीं है, तो आपको इसे तुरंत हटा देना चाहिए, या बस करना चाहिए:

exc_type, exc_value = sys.exc_info()[:2]

एक साथ सभी से बचने के लिए।


18
यह अब सच नहीं है कि कचरा संग्रहकर्ता इसे एकत्र नहीं करेगा। हालांकि, चक्र संग्रह में देरी करेगा।
विंस्टन एवर्ट

यह बहुत प्रासंगिक नहीं है, और सेशन के प्रश्न का उत्तर नहीं देता है।
WhyNotHugo

15

बस एक और सोच।

जब Django जैसे फ्रेमवर्क में http एप्लिकेशन डिबगिंग करते हैं, तो पहले से उपयोग किए गए बेकार और गड़बड़ किए गए कॉल से भरे हुए स्टैक, खासकर जब यह बहुत लंबी सूची है, डेवलपर्स के लिए बहुत दर्दनाक हो सकता है। इसलिए, इस बिंदु पर, नाम स्थान नियंत्रण उपयोगी हो सकता है।


12

"डेल" का स्पष्ट रूप से उपयोग करना भी किसी को एक चर निर्दिष्ट करने से बेहतर अभ्यास है। यदि आप एक ऐसे चर को डेल करने का प्रयास करते हैं जो मौजूद नहीं है, तो आपको एक रनटाइम त्रुटि मिलेगी, लेकिन यदि आप एक चर को सेट करने का प्रयास करते हैं जो किसी के पास नहीं है, तो पायथन चुपचाप कोई भी नया चर सेट नहीं करेगा, चर को छोड़कर जहां चाहा वहां हटवाया। तो डेल आपको पहले अपनी गलतियों को पकड़ने में मदद करेगा


11

उपरोक्त उत्तरों में कुछ बिंदु जोड़ने के लिए: del x

xसंकेत की परिभाषा r -> o(एक rवस्तु की ओर इशारा करते हुए संदर्भ o) लेकिन इसके बजाय del xबदल जाती rहै o। यह ऑब्जेक्ट से जुड़े ऑब्जेक्ट के बजाय ऑब्जेक्ट के संदर्भ (पॉइंटर) पर एक ऑपरेशन है x। के बीच भेद rऔर oयहाँ कुंजी है।

  • इसे इससे दूर करता है locals()
  • globals()अगर xवहां से है तो इसे हटा देता है।
  • इसे स्टैक फ्रेम से हटाता है (संदर्भ को भौतिक रूप से हटाता है, लेकिन ऑब्जेक्ट ऑब्जेक्ट पूल में ही रहता है और स्टैक फ्रेम में नहीं)।
  • इसे मौजूदा दायरे से हटा देता है। स्थानीय चर की परिभाषा को सीमित करने के लिए यह बहुत उपयोगी है, जो अन्यथा समस्याओं का कारण बन सकता है।
  • यह सामग्री की परिभाषा के बजाय नाम की घोषणा के बारे में अधिक है।
  • यह प्रभावित करता है कि कहां xहै, कहां नहीं xहै। स्मृति में केवल भौतिक परिवर्तन यह है। उदाहरण के लिए यदि xकोई शब्दकोश या सूची में है, तो यह (एक संदर्भ के रूप में) वहां से हटा दिया जाता है (और आवश्यक रूप से ऑब्जेक्ट पूल से नहीं)। इस उदाहरण में, यह जो शब्दकोश है वह स्टैक फ्रेम ( locals()) है, जो इसके साथ ओवरलैप होता है globals()

6

Numpy.load का उपयोग करने के बाद फ़ाइल बंद करना

एक आला उपयोग शायद, लेकिन मुझे यह उपयोगी लगा जब numpy.loadएक फ़ाइल पढ़ने के लिए। हर बार एक समय में मैं फ़ाइल को अपडेट करूंगा और निर्देशिका को उसी नाम के साथ एक फ़ाइल को कॉपी करने की आवश्यकता होगी।

मैं delफ़ाइल रिलीज़ करता था और मुझे नई फ़ाइल में कॉपी करने की अनुमति देता था।

नोट मैं withसंदर्भ प्रबंधक से बचना चाहता हूं क्योंकि मैं कमांड लाइन पर भूखंडों के साथ खेल रहा था और टैब को बहुत अधिक दबाए नहीं रखना चाहता था!

इस प्रश्न को देखें ।


मेरे पास पाइथन इमेज लाइब्रेरी (पीआईएल) के साथ लोड की गई छवियों के साथ कुछ ऐसा ही था। मैं एक छवि खोलता हूं, और यदि इसके कुछ आयाम हैं, तो मैं फ़ाइल को हटाना चाहता था; हालाँकि फ़ाइल अभी भी पायथन द्वारा उपयोग में थी। इसलिए, मैंने कहा 'डेल img', और फिर फ़ाइल को हटा सकता है।
physicalattraction

2
खबरदार है कि यह एक कार्यान्वयन विवरण है क्योंकि भाषा विनिर्देश गारंटीकृत __del__()वस्तुओं पर विधि को कॉल करने या यहां तक ​​कि अगर यह बिल्कुल भी कहा जाता है, तो गारंटी नहीं देता है । इसलिए एपीआई जो __del__()विधि की उम्मीद करने के अलावा कुछ और तरीके जारी करने का कोई रास्ता नहीं देते हैं (कुछ समय बाद ही वस्तु कचरा हो जाती है) कुछ हद तक टूट जाते हैं।
ब्लैकजैक

6

delअक्सर __init__.pyफाइलों में देखा जाता है। किसी भी वैश्विक चर को एक __init__.pyफ़ाइल में परिभाषित किया गया है जो स्वचालित रूप से "निर्यात" है (इसे शामिल किया जाएगा from module import *)। इससे बचने का एक तरीका परिभाषित करना है __all__, लेकिन यह गड़बड़ हो सकता है और हर कोई इसका उपयोग नहीं करता है।

उदाहरण के लिए, यदि आपके पास __init__.pyजैसा कोड था

import sys
if sys.version_info < (3,):
    print("Python 2 not supported")

तब आपका मॉड्यूल sysनाम निर्यात करेगा । आपको इसके बजाय लिखना चाहिए

import sys
if sys.version_info < (3,):
    print("Python 2 not supported")

del sys

4

delइसका उपयोग किस प्रकार किया जा सकता है, इसका एक उदाहरण के रूप में , मुझे यह उपयोगी लगता है जैसे कि मैं इस तरह की स्थितियों:

def f(a, b, c=3):
    return '{} {} {}'.format(a, b, c)

def g(**kwargs):
    if 'c' in kwargs and kwargs['c'] is None:
        del kwargs['c']

    return f(**kwargs)

# g(a=1, b=2, c=None) === '1 2 3'
# g(a=1, b=2) === '1 2 3'
# g(a=1, b=2, c=4) === '1 2 4'

ये दो कार्य अलग-अलग पैकेज / मॉड्यूल में हो सकते हैं और प्रोग्रामर को यह जानने की आवश्यकता नहीं है कि वास्तव cमें क्या डिफ़ॉल्ट मान तर्क fहै। तो डेल के साथ संयोजन में kwargs का उपयोग करके आप यह कह सकते हैं कि "मुझे सी पर डिफ़ॉल्ट मान चाहिए" इसे किसी को भी सेट करके (या इस मामले में भी इसे छोड़ दें)।

आप कुछ ऐसा ही कर सकते हैं:

def g(a, b, c=None):
    kwargs = {'a': a,
              'b': b}
    if c is not None:
        kwargs['c'] = c

    return f(**kwargs)

हालाँकि मुझे पिछले उदाहरण अधिक DRY और सुरुचिपूर्ण लगे।


3

कब अजगर में डेल उपयोगी है?

आप इसका उपयोग स्लाइस सिंटैक्स के बजाय किसी सरणी के एकल तत्व को निकालने के लिए कर सकते हैं x[i:i+1]=[]। यह तब उपयोगी हो सकता है जब आप उदाहरण के लिए हों os.walkऔर निर्देशिका में किसी तत्व को हटाना चाहते हों। मैं इसके लिए उपयोगी किसी कीवर्ड पर विचार नहीं करूंगा, क्योंकि कोई केवल एक [].remove(index)विधि बना सकता है ( .removeविधि वास्तव में खोज-और-हटाने-पहले-उदाहरण-मूल्य है)।


7
[].pop(index)और [].remove(item)"index"मूल्य के बारे में बात करते समय नामांकित चर का उपयोग न करें , यह भ्रमित करता है।
स्की

@Ski पॉप इंडेक्स का उपयोग करता है । यह एक मान्य उत्तर है जबकि ये आधे उत्तर केवल डेल का उपयोग करके एक उदाहरण देते हैं जहां कोई भी काम नहीं करेगा। सूची में कोई भी सेट की गई वस्तु अभी भी सूची में नहीं है जबकि डेल वस्तुओं को हटा देती है।
user5389726598465

3

जब मैंने delNumpy के साथ बड़े डेटा को हैंडल किया तो मैं छद्म-मैनुअल मेमोरी प्रबंधन के लिए उपयोगी पाया गया। उदाहरण के लिए:

for image_name in large_image_set:
    large_image = io.imread(image_name)
    height, width, depth = large_image.shape
    large_mask = np.all(large_image == <some_condition>)
    # Clear memory, make space
    del large_image; gc.collect()

    large_processed_image = np.zeros((height, width, depth))
    large_processed_image[large_mask] = (new_value)
    io.imsave("processed_image.png", large_processed_image)

    # Clear memory, make space
    del large_mask, large_processed_image; gc.collect()

यह एक स्क्रिप्ट को पीसने के पड़ाव में लाने के बीच का अंतर हो सकता है, क्योंकि सिस्टम पागल की तरह पागल हो जाता है जब पायथन जीसी ऊपर नहीं रख सकता है, और यह एक ढीली मेमोरी थ्रेशोल्ड के नीचे पूरी तरह से चिकनी चल रहा है जो ब्राउज़ करने के लिए मशीन का उपयोग करने के लिए बहुत सारे हेडरूम छोड़ देता है और यह काम करते हुए कोड।


2

मुझे लगता है कि डेल का अपना सिंटैक्स होने के कारणों में से एक यह है कि इसे किसी फ़ंक्शन के साथ बदलना कुछ मामलों में कठिन हो सकता है क्योंकि यह बंधन या चर पर संचालित होता है न कि इसके संदर्भ में मूल्य। इस प्रकार यदि डेल के एक फंक्शन वर्जन को बनाया जाना था तो एक संदर्भ को पास करना होगा। डेल फू को ग्लोबल्स () हटाना होगा ('फू') या लोकल ()। रिमूव ('फू') जो गन्दा हो जाता है। और कम पठनीय। फिर भी मैं कहता हूं कि डेल से छुटकारा पाना अच्छा होगा क्योंकि इसका उपयोग दुर्लभ प्रतीत होता है। लेकिन भाषा की विशेषताओं / दोषों को दूर करना दर्दनाक हो सकता है। शायद अजगर 4 इसे हटा देगा :)


2

मैं स्वीकार किए जाते हैं जवाब पर विस्तृत करने के लिए एक चर निर्धारित करने के बीच अति सूक्ष्म अंतर को उजागर करना चाहते हैं Noneके साथ इसे हटाने बनाम del:

चर foo = 'bar', और निम्न फ़ंक्शन परिभाषा को देखते हुए :

def test_var(var):
    if var:
        print('variable tested true')
    else:
        print('variable tested false')

एक बार शुरू में घोषित किए जाने के बाद, उम्मीद के test_var(foo)मुताबिक पैदावार होती variable tested trueहै।

अब कोशिश करो:

foo = None
test_var(foo)

जो पैदावार देता है variable tested false

इसके साथ इस व्यवहार का विरोध करें:

del foo
test_var(foo)

जो अब उठता है NameError: name 'foo' is not defined


0

अभी तक एक और आला उपयोग: ROOT5 या ROOT6 के साथ पायरोट में, "डेल" एक पायथन ऑब्जेक्ट को हटाने के लिए उपयोगी हो सकता है जो कि एक गैर-लंबी मौजूदा C ++ ऑब्जेक्ट को संदर्भित करता है। यह पाइरॉट के डायनेमिक लुकअप को एक पहचान-नाम वाली C ++ ऑब्जेक्ट को खोजने और इसे अजगर नाम से बाँधने की अनुमति देता है। तो आपके पास एक परिदृश्य हो सकता है जैसे:

import ROOT as R
input_file = R.TFile('inputs/___my_file_name___.root')
tree = input_file.Get('r')
tree.Draw('hy>>hh(10,0,5)')
R.gPad.Close()
R.hy # shows that hy is still available. It can even be redrawn at this stage.
tree.Draw('hy>>hh(3,0,3)') # overwrites the C++ object in ROOT's namespace
R.hy # shows that R.hy is None, since the C++ object it pointed to is gone
del R.hy
R.hy # now finds the new C++ object

उम्मीद है, यह जगह ROOT7 के सेर ऑब्जेक्ट मैनेजमेंट के साथ बंद हो जाएगी।


0

"डेल" कमांड एक सरणी में डेटा को नियंत्रित करने के लिए बहुत उपयोगी है, उदाहरण के लिए:

elements = ["A", "B", "C", "D"]
# Remove first element.
del elements[:1]
print(elements)

आउटपुट:

['बी', 'सी', 'डी']


-2

एक बार मुझे उपयोग करना था:

del serial
serial = None

क्योंकि केवल का उपयोग कर:

serial = None

सीरियल पोर्ट को इतनी जल्दी रिलीज नहीं किया कि तुरंत उसे फिर से खोल सकें। उस पाठ से मुझे पता चला कि delवास्तव में इसका मतलब था: "जीसी दिस नाउ! और तब तक प्रतीक्षा करें जब तक यह पूरा न हो जाए" और यह वास्तव में बहुत सारी स्थितियों में उपयोगी है। बेशक, आप एक हो सकता है system.gc.del_this_and_wait_balbalbalba(obj)


5
हम्म ... कि वास्तव में एक फर्क नहीं करना चाहिए था। हालाँकि, शायद आपका मुद्दा अतिरिक्त विलंब के कारण तय किया गया था?
विंस्टन एवर्ट

3
मुझे नहीं लगता कि आप जीसी को अब किसी भी दस्तावेज द्वारा वापस कर सकते हैं । मुझे लगता है कि GC पर भरोसा करना और __del__()पायथन में कॉल करना हमेशा गलत है (मुझे इस डिज़ाइन के कारणों का पता नहीं है, हालांकि) और संदर्भ प्रबंधक API ( withकथन) का उपयोग करना बेहतर है ।
पावेल Paमिरदा

1
यह किसी प्रकार की वूडू प्रोग्रामिंग है। विवरण के लिए विधि विवरण और दस्तावेज़ में नोट .__ del __ () विवरण के लिए देखें, और ध्यान रखें कि यह केवल संदर्भ गणना के साथ CPythons वर्तमान कार्यान्वयन का वर्णन करता है। अन्य पायथन कार्यान्वयन (PyPy, Jython, IronPython, Brython,…) या भविष्य के CPython कार्यान्वयन अलग कचरा संग्रहण योजना का उपयोग कर सकते हैं। Jython JVMs GC का उपयोग करता है जो वस्तुओं को तुरंत नहीं हटाता है। serialमॉड्यूल भी Jython के साथ काम करता तो अपने हैक वहाँ काम नहीं करता है!
ब्लैकजैक

BTW gc.collect स्पष्ट रीसायकल करने का तरीका होगा। सबसे अजगर कार्यान्वयन में समर्थित।
tdihp

-2

डेल कई भाषाओं में "परेशान" के बराबर है और एक क्रॉस रेफ़रेंस पॉइंट के रूप में दूसरी भाषा से अजगर तक जा रहा है .. लोग उन कमांडों की तलाश करते हैं जो वही काम करते हैं जो वे अपनी पहली भाषा में करते थे ... सेटिंग भी "a" या कोई भी वास्तव में var को स्कोप से नहीं हटाता है..यह सिर्फ इसके मूल्य को खाली कर देता है क्योंकि var का नाम अभी भी मेमोरी में संग्रहीत होगा ... क्यों?!? एक मेमोरी इंटेंसिव स्क्रिप्ट में..इसके पीछे सिर्फ एक नहीं और किसी भी तरह से कचरा डालना ... हर भाषा में "अनसेट / डिलीट" वर्जन फंक्शन का कोई न कोई रूप होता है..क्यों नहीं अजगर?


7
delकचरे के संग्रहकर्ता को और अधिक तेज़ी से आमंत्रित नहीं करता है = None, और न ही लंबे समय में कचरा छोड़ देगा। आप पाइथन के कचरा संग्रह के बारे में जानना चाहते हैं।
सिल्वरबैकनेट

-3

अजगर की हर वस्तु में एक पहचानकर्ता, प्रकार, संदर्भ संख्या होती है, जिसके साथ हम जुड़े हुए हैं, जब हम डेल का उपयोग करते हुए संदर्भ गणना कम कर देते हैं, जब संदर्भ गणना शून्य हो जाती है तो यह कचरा एकत्र करने के लिए एक संभावित उम्मीदवार होता है। जब कोई भी पहचानकर्ता की स्थापना करने की तुलना में यह डेल को अलग करता है। बाद के मामले में इसका सीधा सा मतलब है कि वस्तु सिर्फ जंगली रह गई है (जब तक कि हम उस दायरे से बाहर नहीं होते हैं, जिसमें गिनती कम हो जाती है) और बस अब पहचानकर्ता किसी अन्य वस्तु (मेमोरी लोकेशन) की ओर इशारा करता है।


3
मैं इसका प्रमाण देखना चाहूंगा। किसी को भी सौंपने से संदर्भ संख्या में कमी नहीं होनी चाहिए।
जेसन बेकर

3
यह एक बकवास और कचरा संग्रह के विपरीत है (चारों ओर पड़े कचरे को छोड़ने के अर्थ में)।
पावेल Paमरदा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.