python tutorial क्या "foo is none" और "foo== कोई नहीं" के बीच कोई अंतर है?




python tutorial pdf (9)

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

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

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

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

if foo is None: pass

तथा

if foo == None: pass

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


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

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

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


कुछ और विवरण:

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

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

  3. bool , int , string (कुछ अपवाद के साथ) आदिम प्रकारों का इंस्टेंटेशन, कोई भी मान रखने वाला कोई भी 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

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


जॉन माचिन के निष्कर्ष कि 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 है।


पहचान के लिए परीक्षण है, समानता नहीं । आपके कथन के लिए 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

चेतावनी:

if foo:
  # do something

बिल्कुल ठीक नहीं है:

if x is not None:
  # do something

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


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

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


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


@ Jason :

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

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

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





python