दिलचस्प पोस्ट
java.lang.IllegalAccessError: विधि का उपयोग करने की कोशिश की HTTP शीर्षलेख के लिए मुझे किस एन्कोडिंग का उपयोग करना चाहिए? एसस। एससीएसएस: नेस्टिंग और कई वर्गों? एंड्रॉइड में मैं एक कार्यशील ऊर्ध्वाधर सीकबार कैसे प्राप्त कर सकता हूं? सी # में किसी फ़ंक्शन से मैं कई मान कैसे वापस कर सकता हूं? निलंबित होने पर भी iOS ऐप्लिकेशन के लिए स्थान अपडेट प्राप्त करें पीडीएफबॉक्स प्रतीक मुद्रा यूरो को सांकेतिक शब्दों में बदलना एंड्रॉइड डिवाइस पर सॉफ़्टवेयर कीबोर्ड दृश्यमान है, तो मैं यह कैसे पता लगाऊँ? वापसी का प्रकार '?:' (टर्नरी सशर्त ऑपरेटर) ऐसी फाइल लोड नहीं कर सकता – स्क्रिप्ट / रेल: रूबीमाइन के माध्यम से दूरस्थ डीबगिंग करते समय यह त्रुटि प्राप्त करना ModelState.IsValid == गलत, क्यों? हमारे पास कितने संकेत दिए जा सकते हैं? CSS3 बॉर्डर अपारदर्शिता? वचन के लिए लूप लिखने का सही तरीका स्प्रिंग रेस्टटेमप्लेट – अनुरोधों / प्रतिक्रियाओं के पूर्ण डिबगिंग / लॉगिंग को सक्षम कैसे करें?

क्या "फू कोई नहीं है" और "फू == कोई नहीं" के बीच कोई अंतर है?

क्या इसमें कोई अंतर है:

if foo is None: pass 

तथा

 if foo == None: pass 

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

वेब के समाधान से एकत्रित समाधान "क्या "फू कोई नहीं है" और "फू == कोई नहीं" के बीच कोई अंतर है?"

हमेशा रिटर्न देता है यदि यह एक ही वस्तु उदाहरण की तुलना करता है

जबकि == अंततः __eq__() विधि द्वारा निर्धारित किया जाता है

अर्थात

 >>> class Foo(object): def __eq__(self, other): return True >>> f = Foo() >>> f == None True >>> f is None False 

आप इस ऑब्जेक्ट पहचान और समकक्ष को पढ़ना चाह सकते हैं।

बयान 'है' वस्तु पहचान के लिए प्रयोग किया जाता है, यह जांचता है कि यदि ऑब्जेक्ट एक ही उदाहरण (मेमोरी में समान पते) को दर्शाता है।

और '==' कथन समानता को संदर्भित करता है (वही मान)।

चेतावनी:

 if foo: # do something 

ठीक उसी तरह नहीं है:

 if x is not None: # do something 

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

(ob1 is ob2) बराबर (id(ob1) == id(ob2))

कारण foo is None पसंदीदा तरीका foo is None है कि आप एक ऐसी वस्तु का संचालन कर सकते हैं जो अपने स्वयं के __eq__ को परिभाषित करती है, और वह ऑब्जेक्ट को किसी के समान होने के लिए परिभाषित करता है। इसलिए, हमेशा foo is None उपयोग करें foo is None यदि आपको यह देखने की आवश्यकता है कि क्या यह None फर्क None पड़ता है

इसमें कोई फर्क नहीं पड़ता है क्योंकि ऑब्जेक्ट समान हैं जो निश्चित रूप से बराबर होंगे। हालांकि, पीईपी 8 में स्पष्ट रूप से कहा गया है कि आप उपयोग करना चाहिए:

किसी की तरह एकलकों की तुलना में कोई भी हमेशा के साथ किया जाना चाहिए या नहीं, समानता ऑपरेटर कभी नहीं।

कोई नहीं के लिए समानता (==) और पहचान (है) के बीच कोई अंतर नहीं होना चाहिए NoneType शायद समानता के लिए पहचान लौटाता है चूंकि कोई भी एकमात्र उदाहरण नहीं है जो आप NoneType के बना सकते हैं (मुझे लगता है कि यह सच है), दो ऑपरेशन समान हैं। अन्य प्रकार के मामलों में यह हमेशा मामला नहीं होता है। उदाहरण के लिए:

 list1 = [1, 2, 3] list2 = [1, 2, 3] if list1==list2: print "Equal" if list1 is list2: print "Same" 

यह "बराबर" को प्रिंट करेगा क्योंकि सूचियों की एक तुलना ऑपरेशन होती है जो पहचान की डिफ़ॉल्ट वापसी नहीं है।

@ जेसन :

मैं की तर्ज साथ कुछ और का उपयोग करने की सलाह देते हैं

 if foo: #foo isn't None else: #foo is None 

मुझे "if foo" का उपयोग करना पसंद नहीं है: "जब तक कि foo वास्तव में एक बूलियन मान (यानी 0 या 1) का प्रतिनिधित्व करता है। यदि foo एक स्ट्रिंग या वस्तु या कुछ और है, "यदि foo:" काम कर सकता है, लेकिन यह मेरे लिए एक आलसी शॉर्टकट जैसा दिखता है अगर आप यह देखने के लिए जाँच रहे हैं कि एक्स कोई नहीं है, तो "यदि कोई नहीं है तो:" कहें।

पहचान के लिए परीक्षण है, समानता नहीं है आपके कथन foo is none , पायथन ऑब्जेक्ट के मेमोरी एड की तुलना करता है। इसका अर्थ है कि आप सवाल पूछ रहे हैं "क्या मेरे पास वही वस्तु के लिए दो नाम हैं?"

== __eq__() विधि द्वारा निर्धारित समानता के लिए दूसरे हाथ परीक्षण पर। यह पहचान के बारे में परवाह नहीं करता है

 In [102]: x, y, z = 2, 2, 2.0 In [103]: id(x), id(y), id(z) Out[103]: (38641984, 38641984, 48420880) In [104]: x is y Out[104]: True In [105]: x == y Out[105]: True In [106]: x is z Out[106]: False In [107]: x == z Out[107]: True 

None सिंगलटन ऑपरेटर None है तो None is None भी हमेशा सच None is None है।

 In [101]: None is None Out[101]: True 

जॉन माचिन के निष्कर्ष यह है कि None सिंगलटन None है, इस कोड के आधार पर एक निष्कर्ष है।

 >>> x = None >>> y = None >>> x == y True >>> x is y True >>> 

चूंकि None सिंगलटन None है, x == None और x is None नतीजा x is None होगा। हालांकि, मेरी सौंदर्यवादी राय में, x == None भी सबसे अच्छा x == None है

कुछ और विवरण:

  1. यह खंड वास्तव में जांचता है कि क्या दो object समान स्मृति स्थान पर हैं या नहीं। यानी वे दोनों एक ही स्मृति स्थान को इंगित करते हैं और एक ही id

  2. 1 के परिणामस्वरूप, is सुनिश्चित करता है कि, या नहीं, दो व्याख्यात्मक प्रतिनिधित्व वाले object समान गुण हैं (विशेषताओं के गुण …) या नहीं

  3. NoneType , int , string (कुछ अपवाद के साथ) आदिम प्रकारों का NoneType , एक ही मान वाला कोई भी NoneType हमेशा एक ही मेमोरी स्थान में होगा।

उदाहरण के लिए

 >>> int(1) is int(1) True >>> str("abcd") is str("abcd") True >>> bool(1) is bool(2) True >>> bool(0) is bool(0) True >>> bool(0) False >>> bool(1) True 

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