अजगर में स्पष्ट चर


207

क्या अजगर में एक चर के मूल्य को साफ करने का एक तरीका है?

उदाहरण के लिए अगर मैं एक बाइनरी ट्री को लागू कर रहा था:

Class Node:
    self.left = somenode1
    self.right = somenode2

अगर मैं पेड़ से कुछ नोड निकालना चाहता हूं, तो मुझे self.leftखाली करने की आवश्यकता होगी ।


जवाबों:


157

इसमें गलत क्या है self.left = None?


19
कोई भी कीवर्ड से परिचित नहीं है। क्या यह अन्य भाषाओं में शून्य के समान है?
Bnicholas

6
हाँ; यह अशक्त के बराबर है।
स्मैशरी

12
@Bnicholas हालांकि यह nullPHP में ऐसा नहीं है, जिसमें PHP में एक चर सेट करना nullआपको ज्यादातर मामलों में समान व्यवहार देता है जैसे कि आपने इसे पहले स्थान पर परिभाषित नहीं किया था। Noneअजगर का एक मान एक अपरिभाषित चर से काफी अलग है। हालांकि, Noneअधिकांश अन्य अवतारों की तरह है null, (जब तक कि हम अधिक रहस्यमय विवरण में नहीं मिलते, कम से कम)।
बेन

यह एक कीवर्ड नहीं है; यह बिल्ट-इन ऑब्जेक्ट के लिए एक सेट-बाय-डिफ़ॉल्ट नाम है। आप Noneअनिर्दिष्ट प्रकार के किसी भी अन्य "सादे" ऑब्जेक्ट के साथ कुछ भी कर सकते हैं: इसे कंटेनरों में संग्रहीत करें, इसका एक स्ट्रिंग प्रतिनिधित्व प्रिंट करें, इस पर कुछ मेटाडेटा की जांच करें ... वैसे भी, क्या आपने "अजगर सुस्त" के लिए Google की कोशिश की थी गुणवत्ता के '? मैं गंभीर हूँ; इसमें थोड़ा विश्लेषण होगा, लेकिन जानकारी वहीं है।
कार्ल केनचेल

18
अजगर टर्मिनल खोलें और टाइप करें print xऔर एंटर दबाएं। जब आप अपरिभाषित चर को प्रिंट करने का प्रयास करते हैं, तो यह एक दुभाषिया त्रुटि पैदा करेगा। लेकिन अगर आप वैरिएबल को परिभाषित करते हैं, और फिर इसे किसी के साथ साफ़ करने की कोशिश करते हैं, तो print xकोड का उपयोग करके Noneआउटपुट के रूप में शब्द का उत्पादन किया जाएगा । मैं अजगर के लिए नया हूं इसलिए मुझसे गलती हो सकती है, लेकिन यह एक साफ चर के व्यवहार की तरह नहीं लगता है।
मूसीकास ३०००

407

delकीवर्ड करना होगा।

>>> a=1
>>> a
1
>>> del a
>>> a
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined

लेकिन इस मामले में मैं वोट देता हूं self.left = None


18
कभी-कभी यह इसे पूरी तरह से नहीं हटाता है यह केवल मेमोरी में उस संदर्भ को हटा देता है। यह भूत चर को स्मृति में छोड़ सकता है जो gc नहीं मिलता है।
बोएर

4
delइसका नुकसान यह भी है कि यदि आप एक चर को हटाने की कोशिश करते हैं जो मौजूद नहीं है तो यह एक अपवाद नहीं है, जो आमतौर पर अवांछनीय है।
फिलिप कर्न्स

33
मैं सिर्फ यह बताना चाहता था कि यदि आपने गलती से एक वैरिएबल घोषित कर दिया है, जो कि कमांड में निर्मित ओवरराइटिंग है, जैसे type=… कि जब आप टाइप करना चाहते थे, type(…)तो उसे हटाना मूल कार्यक्षमता को वापस लाने का सबसे आसान तरीका है। यही है, अगर आप इसे अपने आसपास रखते हैं तो कोई भी आप अभी भी अंतर्निहित फ़ंक्शन तक नहीं पहुंच पाएंगे।
मपीसेर

1
कचरा संग्रह / कलेक्टर / संग्रहित
mccc

1
यह वही था जिसकी मुझे तलाश थी। Cmd लाइन में खेलते हुए, मेरे पास ... set = set(myList)और तब मुझे एहसास हुआ कि मैं अब एक फंक्शन (doh) के रूप में सेट का उपयोग नहीं कर सकता। का उपयोग कर del setमुझे एक fx के रूप में फिर से उपयोग करने की अनुमति दी। निश्चित रूप से मैं वास्तविक स्क्रिप्ट में उस आरक्षित संस्करण का उपयोग कभी नहीं करूंगा।
jbchurchill

111

var = None "मान को साफ करता है", चर के मान को "शून्य" की तरह "कोई नहीं" के मूल्य को सेट करता है, हालांकि चर के लिए सूचक रहता है।

del var चर के लिए परिभाषा को पूरी तरह से हटा देता है।

यदि आप बाद में चर का उपयोग करना चाहते हैं, उदाहरण के लिए, इसके लिए एक नया मान सेट करें, अर्थात चर को बनाए रखें, Noneतो बेहतर होगा।


क्या होगा अगर मैं चर को पूरी तरह से हटाना चाहता हूं कि कुछ परिस्थितियों में मौजूद नहीं है। क्या कोई त्रुटि से बचने के लिए कोई पैरामीटर है? मुझे कई चर हटाने की जरूरत है: डेल ए, बी, सी, डी मैं लूप का उपयोग कर सकता हूं और कोशिश कर सकता हूं / इसके अलावा, लेकिन मैं इससे बचने के लिए कुछ स्विच पसंद करता हूं।
टेडो वृबनक

63

दरअसल, यह वैरिएबल / प्रॉपर्टी को डिलीट नहीं करता है। सभी यह करेंगे कि इसके मान को सेट किया जाए None, इसलिए चर अभी भी मेमोरी में जगह लेगा। यदि आप चर के सभी अस्तित्व को स्मृति से पूरी तरह से मिटा देना चाहते हैं, तो आप बस टाइप कर सकते हैं:

del self.left

8
मुझे समझ में नहीं आता है कि = कोई भी उत्तर इतना लोकप्रिय नहीं है। यह सही उत्तर है
निकोले ग्रोमोव

1
ओपी ने कहा clearनहीं remove। डेल विशेषता और लुक्स को मार देगा। यह तरीका है if self.leftकि आप इसे किसी को भी सेट करने के लिए क्लीनर कर सकते हैं, इससे आप जांच सकते हैं और यह जांचने के लिए पर्याप्त होगा कि क्या नोड खाली है।
user1767754

"यह किसी को भी इसे सेट करने के लिए क्लीनर है" - यह विचार करने योग्य है कि यदि कोई व्यक्ति (कुछ समय बाद या सहयोगी) कोड पढ़ रहा है del, तो IMHO, यह और अधिक स्पष्ट करता है कि चर के बारे में भूल जा सकता है जब 'मानसिक रूप से पार्स कर रहा है ' कोड।
पॉकेटैंड

1
@NikolayGromov अपने दिन से दिन के कोड में, जब आप स्वयं का मूल्य प्राप्त करना चाहते हैं। क्या आप चेक करना पसंद करते हैं if self.left:, या क्या आप एक संभावित NameError अपवाद से निपटना पसंद करते हैं जो आपके प्रोग्राम को क्रैश कर देगा यदि आप हर जगह हैंडल नहीं करते हैं ?
पियरे.ससौलस

33
  • यदि इसका उपयोग पूरी तरह से हटाना चाहते हैं del:

    del your_variable

  • या अन्यथा, मूल्य बनाने के लिएNone :

    your_variable = None

  • यदि यह एक चलने योग्य है (जैसे सूची या टपल), तो आप इसे खाली कर सकते हैं जैसे:

    your_variable.clear()

फिर your_variableखाली हो जाएगा


दूसरे विकल्प के लिए, "इसकी सामग्री को साफ़ करें" सही नहीं है, यह केवल चर को फिर से असाइन नहीं करेगा, मूल वस्तु अभी भी बनी रहेगी (जब तक कि इसकी संदर्भ गणना शून्य तक नहीं घटती है, जिस स्थिति में यह कचरा एकत्र किया जाता है)।
cs95

0

क्या आप एक चर को हटाना चाहते हैं, नहीं?

ठीक है, मुझे लगता है कि मुझे @bnul उत्तर के लिए सबसे अच्छा वैकल्पिक विचार मिला है:

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

del x या आप उन्हें ग्लोबल्स () ऑब्जेक्ट से निकाल सकते हैं:

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

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

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

कृपया इस उत्तर पर पुनर्विचार करें!


-1

मैंने ऊपर उल्लिखित कुछ विकल्पों का उपयोग किया है:

del self.left

या किसी का उपयोग करने के लिए मूल्य सेटिंग

self.left = None

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

print("The value of the variable is {}".format(self.left))

आपको चर मुद्रण का मान दिखाई दे सकता है "चर का मान कोई नहीं है"। इस प्रकार, आपको वहां कुछ अपवाद हैंडलर लगाने होंगे:

if self.left:
    #Then only print stuff

उपरोक्त कमांड केवल वैल्यू प्रिंट करेगा यदि सेल्फ नहीं है None

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.