software - python tutorial pdf




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

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

if foo is None: pass

तथा

if foo == None: pass

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


@ Jason :

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

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

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


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

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

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


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


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

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

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


चेतावनी:

if foo:
  # do something

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

if x is not None:
  # do something

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


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


यदि यह वही ऑब्जेक्ट उदाहरण की तुलना करता है तो हमेशा True लौटाता है

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

अर्थात


>>> class Foo(object):
       def __eq__(self, other):
           return True

>>> f = Foo()
>>> f == None
True
>>> f is None
False

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





python