क्या दुभाषिया की स्मृति से निर्मित चर, कार्यों आदि को हटाने का एक तरीका है?


113

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

जब मैं अजगर के खोल में हूं, तो मैं टाइप करता हूं: dir()और मैं सभी वस्तुओं के सभी नाम मौजूदा दायरे (मुख्य ब्लॉक) में देख सकता हूं, उनमें से 6 हैं:

['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__']

फिर, जब मैं एक चर घोषित कर रहा हूं, उदाहरण के लिए x = 10, यह स्वचालित रूप से अंतर्निहित मॉड्यूल के तहत वस्तुओं की सूची में जोड़ता है dir(), और जब मैं dir()फिर से टाइप करता हूं , तो यह अब दिखाता है:

['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'x']

वही फंक्शन, क्लासेस वगैरह के लिए जाता है।

मैं मानक 6 को मिटाए बिना उन सभी नई वस्तुओं को कैसे हटाऊं जो शुरुआत में उपलब्ध हैं?

मैंने यहां "मेमोरी क्लीनिंग", "कंसोल की सफाई" के बारे में पढ़ा है, जो कमांड प्रॉम्प्ट विंडो से सभी पाठ मिटा देता है:

>>> import sys
>>> clear = lambda: os.system('cls')
>>> clear()

लेकिन यह सब कुछ नहीं है जो मैं हासिल करने की कोशिश कर रहा हूं, यह सभी उपयोग की गई वस्तुओं को साफ नहीं करता है।


2
आपको ऐसा क्यों लगता है कि आपको ऐसा करने की आवश्यकता है, या आप सिर्फ जिज्ञासा से बाहर पूछ रहे हैं?
PM 2Ring

मुझे अभी पता नहीं था कि वहाँ एक delसमारोह है। मैं पायथन सीखना शुरू कर रहा हूं और अक्सर शेल में प्रयोग करना पड़ता है, इसलिए मानक चर नाम जैसे xया yअक्सर पहले से उपयोग में हैं और शेल को पुनरारंभ करने के लिए एक और 15 सेकंड लगते हैं (मेरे पास एक बहुत, बहुत पुराना लैपटॉप है)। इसलिए मैं पायथन मेमोरी को जल्दी से साफ करने का एक तरीका खोजना चाहता था।
फफूंद

1
आह। FWIW, delवास्तव में एक फ़ंक्शन नहीं है, इसलिए नहीं (और )। यह एक कीवर्ड है जो एक डेल स्टेटमेंट का परिचय देता है। बेशक, यह वास्तव में किसी वस्तु को कैसे हटाता है, इसमें फ़ंक्शंस शामिल हो सकते हैं, लेकिन यह एक और कहानी है ...
PM 2Ring

जब तक आप उपयोग नहीं कर रहे हैं, तब तक शेल नामों में प्रयोग करना xया yउपयोग में नहीं होना चाहिए । या जब तक आप मूर्खतापूर्ण कुछ नहीं करते हैं , तब तक आपको जगह-जगह कूड़े के ढेर दिखाई देंगे। :)from _somemodule_ import *
PM 2Ring

1
मैंने इस प्रश्न के लिए अपना रास्ता खोज लिया और अब मैं सोच रहा हूं - अगर मैं सभी चर और कार्यों को किसी भी तरह से हटाना चाहता हूं, तो मैं सिर्फ कर्नेल को फिर से शुरू नहीं कर सकता और फिर से स्क्रिप्ट को फिर से कैसे चला सकता हूं?
आवारा

जवाबों:


159

आप इसके साथ अलग-अलग नाम हटा सकते हैं del:

del x

या आप उन्हें globals()वस्तु से हटा सकते हैं :

for name in dir():
    if not name.startswith('_'):
        del globals()[name]

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

आपके द्वारा आयात किए गए मॉड्यूल आयात import osकिए जाते हैं क्योंकि वे संदर्भित होते हैं sys.modules; बाद में आयात पहले से आयातित मॉड्यूल ऑब्जेक्ट का पुन: उपयोग करेगा। आपके पास अपने वर्तमान वैश्विक नामस्थान में उनका संदर्भ नहीं होगा।


खैर, मुझे कहना startswith('_')है कि बहुत भोली लगती है। यदि कोई लिखने _foo=42या यहां तक ​​कि स्मार्ट है __foo__=42, तो हम इन्हें कैसे हटा सकते हैं? क्या प्रोग्रामेटिक रूप से मानक मॉड्यूल गुणों के नाम प्राप्त करने का एक तरीका है?
जॉर्ज

2
@georg: मैंने लूप को रक्षात्मक रूप से कोडित किया है। यदि आप बेहतर करना चाहते हैं, तो आपको नामों की प्रारंभिक सूची को हार्डकोड करना होगा।
मार्टिन पीटर्स

तो, कोई रास्ता नहीं? मेरा विचार था dir(ModuleType()), लेकिन यह केवल रिटर्न docऔर name
जॉर्ज

1
@georg: nope; इंटरप्रेटर का वैश्विक नामस्थान रिलीज़ से रिलीज़ होने के साथ-साथ बदलता रहता है, और बाद में स्टेज पर इंटरप्रेटर खोलने पर वहाँ क्या है, यह पता लगाने के लिए मूर्खतापूर्ण तरीका नहीं है (कि मुझे पता है) ।
मार्टिन पीटर्स

1
@nak कार्य और कक्षाएं किसी भी अन्य की तरह सिर्फ एक वस्तु हैं। वे विशेष नहीं हैं; श्वेतसूची का उपयोग करें या कक्षाओं और कार्यों को संरक्षित करने के लिए आवश्यक वस्तु प्रकार की जांच करें।
मार्टिन पीटर्स

67

हाँ। IPython में सब कुछ हटाने का एक सरल तरीका है। IPython कंसोल में, बस टाइप करें:

%reset

तब सिस्टम आपसे पुष्टि करने के लिए कहेगा। प्रेस y यदि आप इस संकेत को देखना नहीं चाहते हैं, तो बस टाइप करें:

%reset -f

ये काम करना चाहिए ।।


1
एक बार फिर, यह एक शीर्ष उत्तर क्यों नहीं है?
मिरादियो

11
@myradio क्योंकि यह IPython का उपयोग नहीं करने वाले सभी के लिए अप्रासंगिक है , और, यह न तो सवाल का जवाब देता है; प्रश्न पूछता है कि वैश्विक वस्तु संदर्भों को कैसे हटाया जाए, IPython शेल की सामग्री को रीसेट नहीं किया जाए ।
एंड्रियास

17

आप अजगर कचरा कलेक्टर का उपयोग कर सकते हैं:

import gc
gc.collect()

6
हे @ फ़रदीन! धन्यवाद! आपके जवाब ने काम किया और मेरा दिन बच गया! लेकिन gc.collect () से पहले मैंने डेल (परिवर्तनशील) किया था।
गमोसी गनक

9

यदि आप एक इंटरैक्टिव वातावरण में हैं जैसे Jupyterया ipythonआप अवांछित संस्करण को साफ़ करने में रुचि रखते हैं यदि वे भारी हो रहे हैं।

जादू-आदेशों reset और reset_selectiveजैसे इंटरैक्टिव अजगर सत्र पर vailable है ipythonऔरJupyter

1) reset

reset तर्कों के बिना कहे जाने वाले उपयोगकर्ता द्वारा परिभाषित सभी नामों को हटाकर नाम स्थान को रीसेट करता है।

inऔर outपैरामीटर निर्दिष्ट करते हैं कि आप इन / आउट कैश को फ्लश करना चाहते हैं या नहीं। डायरेक्ट्री हिस्ट्री को dhistपैरामीटर के साथ फ्लश किया जाता है।

reset in out

एक और दिलचस्प यह है arrayकि केवल सुन्न Arrays को हटाता है:

reset array

2) reset_selective

उपयोगकर्ता द्वारा परिभाषित नामों को हटाकर नामस्थान को रीसेट करता है। इनपुट / आउटपुट इतिहास के आसपास छोड़ दिया जाता है अगर आपको उनकी आवश्यकता होती है।

स्वच्छ ऐरे उदाहरण:

In [1]: import numpy as np
In [2]: littleArray = np.array([1,2,3,4,5])
In [3]: who_ls
Out[3]: ['littleArray', 'np']
In [4]: reset_selective -f littleArray
In [5]: who_ls
Out[5]: ['np']

स्रोत: http://ipython.readthedocs.io/en/stable/interactive/magics.html


6

इसने मेरे लिए काम किया।

स्थानीय लोगों द्वारा इसके बाद ग्लोबल्स के लिए आपको इसे दो बार चलाने की आवश्यकता है

for name in dir():
    if not name.startswith('_'):
        del globals()[name]

for name in dir():
    if not name.startswith('_'):
        del locals()[name]

4

वास्तव में अजगर उस मेमोरी को पुनः प्राप्त कर लेगा जो अब उपयोग में नहीं है। इसे कचरा संग्रह कहा जाता है जो अजगर में स्वचालित प्रक्रिया है। लेकिन फिर भी अगर आप इसे करना चाहते हैं तो आप इसे डिलीट कर सकते हैं del variable_name। आप इसे वेरिएबल को असाइन करके भी कर सकते हैंNone

a = 10
print a 

del a       
print a      ## throws an error here because it's been deleted already.

कचरा बीनने वाले के माध्यम से अपरिचित अजगर वस्तुओं से वास्तव में स्मृति को पुनः प्राप्त करने का एकमात्र तरीका है। डेल कीवर्ड बस एक ऑब्जेक्ट से एक नाम को खोल देता है, लेकिन ऑब्जेक्ट को अभी भी कचरा एकत्र करने की आवश्यकता है। आप gc मॉड्यूल का उपयोग करके चलाने के लिए कचरा संग्रहकर्ता को बाध्य कर सकते हैं, लेकिन यह लगभग निश्चित रूप से एक समयपूर्व अनुकूलन है लेकिन इसके अपने जोखिम हैं। उपयोग करने delका कोई वास्तविक प्रभाव नहीं है, क्योंकि वे नाम हटा दिए गए होंगे क्योंकि वे किसी भी तरह से दायरे से बाहर हो गए थे।


वास्तव में। बेशक, जब दुभाषिया के वैश्विक नाम स्थान के नाम पर काम करना गुंजाइश से बाहर नहीं जा रहा है, लेकिन ऐसा क्या है। :) मुझे लगता है कि यह भी ध्यान देने योग्य है कि उन वस्तुओं द्वारा उपयोग की जाने वाली मेमोरी का क्या होता है जो कचरा एकत्र किया गया है, कार्यान्वयन-निर्भर है, लेकिन अधिकांश पायथन कार्यान्वयन में gc'ed मेमोरी केवल पायथन पूल में वापस जाती है, यह वापस नहीं लौटी है कार्यक्रम से बाहर निकलने तक ओएस।
PM 2Ring

@ PM2Ring LOL :) मुझे ऐसा लगता है। अजगर कहाँ से संदर्भित करते हैं?
डी-कोडर

2
ध्यान दें कि सीपीथॉन में जीसी को केवल संदर्भ चक्र को तोड़ने की आवश्यकता होती है। यदि कोई संदर्भ नहीं रहता है, तो स्मृति से एक वस्तु को हटा दिया जाता है। तो del करता है यहाँ एक असली प्रभाव है।
मार्टिन पीटर्स

@MartijnPieters, इंस्टा-हटाया? क्या यह एक तकनीकी शब्द है? :)
एरिक सन

2
@eryksun: हाँ, जैसा कि RFC 4042-bis2 द्वारा परिभाषित है, बिल्कुल! :-P
मार्टिन पीटर्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.