2013-03-27 5 views
8
Variable = None 

क्या इन तीनों के बीच एक विशिष्ट परिदृश्य में कोई अंतर है? यदि कोई अंतर नहीं है जो उपयोग करने के लिए अधिक उपयुक्त है?'परिवर्तनीय' या 'चर कोई नहीं है'

if Variable: 
print "Hello world" 

और

if Variable is not None: 
print "Hello world" 

और

if Variable != None: 
print "Hello world" 

कोई भी चर के मामले में एक ही कर रहे हैं?

+0

हो सकता है कि वह मिश्रित 'अगर एक्स None' और है' अगर एक्स == None' – jamylak

+0

हाँ, सही। –

+0

को याद दिलाने के लिए धन्यवाद यह बंद होना चाहिए, यह या तो वास्तविक प्रश्न या डुप्लिकेट नहीं है। http: // stackoverflow।कॉम/प्रश्न/3257919/आईएस-नो-बनाम-कोई नहीं http://stackoverflow.com/questions/7816363/if-a-vs-if-a-is-not-none – jamylak

उत्तर

8

क्या इन तीनों के बीच एक विशिष्ट परिदृश्य में कोई अंतर है?

पहले पूछता है कि चर कुछ भी गलत है या नहीं। इस परीक्षा के अलावा None चीजों के सभी प्रकार के लिए असफल हो जायेगी - False, 0, किसी भी खाली अनुक्रम, आदि

दूसरा पूछता है कि क्या यह जादू सिंगलटन निरंतर None है। यह केवल None के लिए ही विफल हो जाएगा।

तीसरा पूछता है कि यह कुछ भी है जो खुद को None के बराबर मानता है। यह Holder(None) कहने में विफल रहेगा, जहां Holder एक रैपर क्लास है जिसका उदाहरण जो भी हो रहा है उसके बराबर तुलना करता है। या, कम यथार्थवादी देने के लिए लेकिन कोड exmaple के लिए छोटा:

class Stupid(object): 
    def __ne__(self, other): 
     return False 
Variable = Stupid() 

आखिरी वाला शायद ही कभी उपयोगी है; वास्तव में, यदि आपको कभी लगता है कि आपको == None या != None की जांच करने की आवश्यकता हो सकती है, और आप विशेष रूप से पारदर्शी-रैपर वर्ग या ऐसा कुछ भी नहीं बना रहे हैं, तो शायद आप वास्तव में is None या is not None चाहते थे। लेकिन अन्य दो बहुत उपयोगी और आम हैं।

यदि कोई अंतर नहीं है तो कौन सा उपयोग करने के लिए उपयुक्त है?

ठीक है, एक अंतर है, और जो एक अधिक उपयुक्त है विशिष्ट उपयोग पर निर्भर करता है।

प्रश्न के अंत में, ऐसा लगता है कि आप पूछ सकते हैं कि विशिष्ट मामले में कोई अंतर है कि Variable निश्चित रूप से None है। उस स्थिति में, निश्चित रूप से तीनों के बीच कोई कार्यात्मक अंतर नहीं है। * उनमें से सभी को झूठी होने की गारंटी है, और इसलिए कुछ भी नहीं। जिसका मतलब है कि इनमें से किसी भी के बीच कोई अंतर नहीं है और कोई कोड नहीं लिख रहा है। जो बहुत आसान, अधिक पठनीय और तेज़ है।

* एक प्रदर्शन अंतर है- पहले व्यक्ति को LOAD_CONSTNone, या तुलना ऑपरेटर को कॉल करने की आवश्यकता नहीं है। और, भले ही आपने किसी भी तरह None को पुनर्निर्मित करने में कामयाब रहे हों या None स्थिरता के मूल्य को बदल दें (शायद ctypes के साथ सभी ढेर पर स्टॉपिंग करके?), पहले व्यक्ति को अभी भी काम करने की अधिक संभावना है। लेकिन इनमें से कोई भी कभी मायने नहीं रखता है-और, अगर वे ऐसा करते हैं, तो फिर भी कोई कोड भी तेज और अधिक भरोसेमंद नहीं होगा।

6

not x सच हो सकता है अगर x, None, False, [], {}, आदि

x is not None हमेशा रहेंगे True है, जब तक एक चर वास्तव में None है।

संपादित करें:

यह व्यावहारिक महत्व का है आप अगर एक चर वास्तव में एक उचित मान पर सेट है जाँच करना चाहते हैं जब भी। अन्यथा आप समस्याओं में भाग सकते हैं। उदाहरण के लिए, अगर आप चाहते हैं मदों की एक सूची का मूल्यांकन करने और ऐसा करने के लिए:

if not x: 

यदि एक सूची प्रदान की गई थी, तो हालत एक खाली सूची, जो अभी भी एक मान्य इनपुट हो सकता है पर ट्रिगर किया जाएगा जाँच करने के लिए। तो उस स्थिति में, आप

if x is not None: 

के साथ जांच खाली सूची के रूप में मान्य इनपुट अनुमति देने के लिए, लेकिन अभी भी मामला है कि सभी में कोई सूची उपलब्ध कराई गई थी जाँच करना चाहते हैं।

None मूल्य null या nil कुछ भाषाओं में मूल्य के बराबर है। यह परिभाषित चर में किसी मान की कमी के लिए प्लेसहोल्डर है (यदि यह अपरिभाषित है, तो यह NameError फेंक देगा)।

>>> def foo(): 
...  pass 
... 
>>> x = foo() 
>>> x is None 
True 

यह भी अक्सर वैकल्पिक चर के लिए एक डिफ़ॉल्ट मान के रूप में इस्तेमाल कर रहा है: यही कारण है कि None मूल्य कुछ मामलों में एक डिफ़ॉल्ट मान के रूप में प्रयोग किया जाता है

>>> def foo(bar=None): 
...  if bar is None: 
...   print('No argument passed.') 
...  else: 
...   print('Variable bar: %s' % str(bar)) 
... 
>>> foo(0) 
Variable bar: 0 
>>> foo() 
No argument passed. 

इस तरह, 0 अभी भी कोई मान्य मान है , if not bar: के साथ चेक किए जाने पर False का मूल्यांकन करेगा।

+0

वार्डिंग नाइटपिक: यदि परिवर्तनीय परिभाषित नहीं किया गया है, 'यदि x कोई नहीं है' अभी भी 'नाम त्रुटि' है, जैसे कि 'अगर नहीं x'। (आप किसी प्रकार का डिफ़ॉल्ट- टू-'नहीं' संदर्भ, इसे इस तरह समझाने में आसान बनाने के लिए कि भ्रामक होने के बिना सरल है?) – abarnert

+0

धन्यवाद, उत्तर संपादित किया गया। –

1

वे अलग हैं। not चेक करता है अगर bool(var)False पर मूल्यांकन करता है।

उदाहरण के लिए।

>>> not '' 
True 
>>> not 'abc' 
False 
>>> not 0 
True 

if x is None जांच करता है कि एक्स None ही है।

3

official PEP 8 recommendation एक पहचान की जांच करने के साथ कोई नहीं के लिए परीक्षण करने के लिए है:

if Variable is not None: 
    print "Hello world" 

समानता/असमानता परीक्षण भी काम करेगा लेकिन धीमी और गैर मुहावरेदार होगा:

if Variable != None: 
    print "Hello world" 

परीक्षण परिवर्तनीय का बूलियन मान एक अलग परिणाम उत्पन्न करता है। निम्न परीक्षण प्रिंट होगा "हैलो दुनिया" यदि चर एक खाली कंटेनर या एक नंबर शून्य के बराबर थे:

# Hello world won't print for any of these values: 
for Variable in(), '', u'', {}, [], 0, 0.0, 0j, None: 
    if Variable: 
     print "Hello world" 
संबंधित मुद्दे