2010-08-22 7 views
45

मैटलैब में 'स्पष्ट' जैसा कुछ ढूंढ रहा हूं: एक कमांड/फ़ंक्शन जो वर्कस्पेस से सभी चर हटा देता है, उन्हें सिस्टम मेमोरी से मुक्त करता है। क्या पाइथन में ऐसी कोई चीज है?मैं पाइथन लिपि के बीच में सभी चर कैसे साफ़ करूं?

संपादित करें: मैं एक स्क्रिप्ट लिखना चाहता हूं जो किसी बिंदु पर सभी चर साफ़ करता है।

+1

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

+0

@sdolan बदल गया – snakile

+0

क्या आप कोई संभावित संदर्भ प्रदान कर सकते हैं जिसमें यह समझ में आता है? –

उत्तर

34

%reset आदेश आदेशों की निम्न क्रम से हर नाम हटाने करता है वर्तमान मॉड्यूल:

>>> import sys 
>>> sys.modules[__name__].__dict__.clear() 

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

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

>>> import sys 
>>> this = sys.modules[__name__] 
>>> for n in dir(): 
... if n[0]!='_': delattr(this, n) 
... 
>>> 

यह क्रम __builtins__ विशेष नाम जो घरों सहित अकेले ऐसे नाम हैं जो निजी या जादुई हैं, छोड़ देता है सब में निर्मित नाम। तो, बनाया-इन अभी भी काम - उदाहरण के लिए:

>>> dir() 
['__builtins__', '__doc__', '__name__', '__package__', 'n'] 
>>> 

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

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

+2

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

+3

आप सही हैं। मुझे यह नहीं करना चाहिए। धन्यवाद। – snakile

+2

हाहा, यह शानदार है ... यह आश्चर्यजनक है कि आप ऐसा करके कितनी कार्यक्षमता खो देते हैं, और फिर भी 'int = (2) .__ class__',' str = '' जैसी सामग्री करके आप कितनी कार्यक्षमता वापस प्राप्त कर सकते हैं .__ class__ ',' True = (1 == 1) 'आदि ... –

35

नहीं, आप दुभाषिया

Ipython को पुन: प्रारंभ बंद सबसे अच्छा कर रहे हैं बंडल दुभाषिया के लिए एक उत्कृष्ट प्रतिस्थापन है और जो आम तौर पर काम करता है

+0

'नहीं' से आपका मतलब है कि मुझे यह नहीं करना चाहिए या यह असंभव है? यदि आप कहते हैं कि मुझे नहीं करना चाहिए तो क्या आप समझा सकते हैं क्यों? – snakile

+4

+1: दुभाषिया में वापस आने के लिए 'ctrl-d' फिर' pyt'-> 'tab' में मेरे लिए एक सेकंड की एक चौथाई से भी कम समय लगता है। यहां कुछ भी फैंसी करने का कोई कारण नहीं है। – sdolan

+1

% रीसेट अधिकांश चर के लिए काम करता है, कुछ के लिए यह नहीं करता है। मेरे लिए, केवल दुभाषिया को पुनरारंभ करने से सब कुछ साफ करने की गारंटी मिलती है। –

22

यदि आप कोई फ़ंक्शन लिखते हैं तो एक बार जब आप गायब हो जाते हैं तो सभी नाम गायब हो जाते हैं।

अवधारणा namespace कहा जाता है और यह बहुत अच्छा है, यह Zen of Python में इसे बनाया:

नेमस्पेस एक महान विचार आवाज कर रहे हैं - के उन लोगों में से अधिक करते हैं!

आईपीथॉन का नामस्थान भी जादू कमांड %reset -f के साथ रीसेट किया जा सकता है।(-f का मतलब है "बल"; दूसरे शब्दों में, "मुझसे पूछें कि क्या मैं वास्तव में सभी चर को हटाना चाहता हूं, बस इसे करें।")

2

यह एलेक्स के उत्तर का एक संशोधित संस्करण है। हम एक मॉड्यूल के नाम स्थान के राज्य को बचाने और निम्नलिखित 2 तरीकों का उपयोग करके इसे फिर से स्थापित कर सकते हैं ...

__saved_context__ = {} 

def saveContext(): 
    import sys 
    __saved_context__.update(sys.modules[__name__].__dict__) 

def restoreContext(): 
    import sys 
    names = sys.modules[__name__].__dict__.keys() 
    for n in names: 
     if n not in __saved_context__: 
      del sys.modules[__name__].__dict__[n] 

saveContext() 

hello = 'hi there' 
print hello    # prints "hi there" on stdout 

restoreContext() 

print hello    # throws an exception 

तुम भी saveContext() और स्पष्ट (कॉल करने से पहले एक पंक्ति "स्पष्ट = restoreContext" जोड़ सकते हैं) होगा matlab के स्पष्ट की तरह काम करते हैं।

+0

ग्रेट उत्तर! मैं पाइथन 3 के लिए विश्वास करता हूं आप पुनर्स्थापित करना चाहते हैं 'नाम = सूची (sys.modules [__ नाम __] .__ dict __। कुंजी())' के साथ कॉन्टेक्स्ट। § अन्यथा पायथन शिकायत करेगा कि आपने इसके आकार के दौरान इसे बदलते समय शब्दकोश आकार बदल दिया है। dict_keys' ऑब्जेक्ट। –

+0

इसके अलावा, जो लोग इस जवाब को आयात करना चाहते हैं (यानी मैंने इसे सहेजा है और मैं इसे होम्योर असाइनमेंट में विभिन्न समस्याओं के बीच नामस्थान को साफ़ करने के लिए एक जुपीटर नोटबुक से आयात करता हूं), मुझे लगता है कि आप '" '__name__' के बजाय __main __" '। –

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

  • कोई संबंधित समस्या नहीं^_^