“कोई नहीं” और “== कोई नहीं” में क्या अंतर है


324

मैं हाल ही में इस सिंटैक्स में आया, मैं अंतर से अनजान हूं।

अगर कोई मुझे अंतर बता सकता है तो मैं इसकी सराहना करूंगा।



1
क्या इससे आपके सवाल का जवाब मिलता है? क्या "==" और "है" के बीच अंतर है?
जून

यह स्पष्ट नहीं है कि यह प्रश्न isबनाम के बारे में है ==, या प्रकृति के बारे में है कि वास्तव में क्या Noneहै और व्यवहार दोनों संदर्भों में कैसे भिन्न है (बाद में मैंने यहां समाप्त किया है)। अस्पष्टता और ओपी प्रतिक्रियाओं की कमी के आधार पर ... मुझे आश्चर्य है कि इसमें बहुत सारे बदलाव हैं। मेरा मतलब है ... cmon ... प्रश्न वास्तविक प्रश्न में भी नहीं लिखा गया है ...
RTbecard

जवाबों:


291

इसका उत्तर यहाँ बताया गया है

उद्धरण के लिए:

एक वर्ग किसी भी तरह से तुलना करने के लिए इसे लागू करने के लिए स्वतंत्र है, और यह किसी के खिलाफ तुलना करने का विकल्प चुन सकता है, जिसका मतलब कुछ है (जो वास्तव में समझ में आता है; यदि किसी ने आपको खरोंच से कोई भी वस्तु लागू करने के लिए कहा है, तो आपको इसे सच करने के लिए और कैसे मिलेगा खुद के खिलाफ;)।

व्यावहारिक रूप से बोलना, बहुत अंतर नहीं है क्योंकि कस्टम तुलना ऑपरेटर दुर्लभ हैं। लेकिन आपको is Noneएक सामान्य नियम के रूप में उपयोग करना चाहिए ।


57
इसके अलावा, :) की is Noneतुलना में थोड़ा (~ 50%) तेज है== None
Nas Banov

26
@ myusuf3: >>> timeit.Timer ('कोई नहीं है')) .समय () | 0.225 | >>> timeit.Timer ('कोई नहीं == कोई नहीं')। timeit () | 0.328
नास बानोव

9
@ myusuf3 आपको वास्तव में इसके लिए किसी प्रमाण की आवश्यकता नहीं है। isमूल रूप से, पूर्णांक तुलना करते समय ==केवल संदर्भों को हल करना नहीं है, बल्कि मूल्यों की तुलना करना जो कि बेमेल प्रकार हो सकते हैं।
पीजूस

4
"है" के पक्ष में एक। जब एक चर या तो कोई भी हो सकता है या ऐसा कुछ नहीं जिसकी किसी के साथ कोई सार्थक तुलना नहीं है। उदाहरण के लिए, एक चर एक numpy.array या कोई नहीं (मेरा विशेष मामला) हो सकता है।
जाब्लास्को

3
मैं यह जोड़ना चाहूंगा कि @TimLudwinski क्या कह रही है: पहले, अगर किसी ने किसी विशेष मामले को बनाने के लिए समानता ऑपरेटर को ओवरराइड करने का विकल्प चुना, तो हम उन्हें अन्यथा क्यों बताना चाहेंगे? दूसरा, "एक होना चाहिए - और अधिमानतः इसे करने के लिए केवल एक ही - स्पष्ट तरीका।" और यह जांचने का स्पष्ट तरीका है कि कुछ समान है या नहीं, ठीक है, समानता ऑपरेटर।
युवावस्था

162
class Foo:
    def __eq__(self,other):
        return True
foo=Foo()

print(foo==None)
# True

print(foo is None)
# False

56

इस मामले में, वे समान हैं। Noneएक सिंगलटन ऑब्जेक्ट है (केवल एक ही मौजूद है None)।

is यह देखने के लिए जाँच करता है कि क्या वस्तु समान वस्तु है, जबकि == केवल जाँच करता है कि क्या वे समतुल्य हैं।

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

p = [1]
q = [1]
p is q # False because they are not the same actual object
p == q # True because they are equivalent

लेकिन चूँकि केवल एक ही है None, वे हमेशा एक ही isरहेंगे , और सच लौटाएंगे।

p = None
q = None
p is q # True because they are both pointing to the same "None"

17
यह उत्तर सही नहीं है, जैसा कि बेन हॉफस्टीन के जवाब में बताया गया है, stackoverflow.com/questions/3257919/is-none-vs-none/…x == Noneमूल्यांकन कर सकते हैं Trueभले ही अपने स्वयं के कस्टम समानता ऑपरेटर के साथ कुछ वर्ग का उदाहरण xनहीं है None
अधिकतम

5

यदि आप सुन्न का उपयोग करते हैं,

if np.zeros(3)==None: pass

जब आप खामियाजा तत्व की तुलना करते हैं तो आपको त्रुटि देगा


3

यह इस बात पर निर्भर करता है कि आप किसी से क्या तुलना कर रहे हैं। कुछ वर्गों में कस्टम तुलना पद्धति होती है जो == Noneअलग तरीके से व्यवहार करती है is None

विशेष रूप से के उत्पादन में a == None भी बूलियन होना जरूरी नहीं है !! - बग का लगातार कारण।

एक विशिष्ट उदाहरण के लिए एक संख्यात्मक सारणी लें, जहाँ ==तुलना तत्व लागू की जाती है:

import numpy as np
a = np.zeros(3) # now a is array([0., 0., 0.])
a == None #compares elementwise, outputs array([False, False, False]), i.e. not boolean!!!
a is None #compares object to object, outputs False
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.