2010-08-14 5 views
35

"नहीं एक्स में" मैंने देखा है कि इन दोनों को एक ही काम करते हैं:पाश हैं: "एक्स नहीं में" बनाम

if x not in list और if not x in list

क्या कुछ मामलों में दोनों के बीच कुछ अंतर है? क्या दोनों होने का कोई कारण है, या ऐसा इसलिए है क्योंकि कुछ लोगों के लिए एक या दूसरे लिखना अधिक स्वाभाविक है?

मुझे अन्य लोगों के कोड में कौन सा देखने की संभावना है?

+0

एक पुराने प्रश्न को एक नए के डुप्लिकेट के रूप में बंद करना पूरी तरह से स्वीकार्य है। Http: //meta.stackoverflow देखें।कॉम/क्यू/255410, http://meta.stackexchange.com/a/147651 – ThisSuitIsBlackNot

उत्तर

50

दो रूपों समान बाईटकोड बनाने के लिए, के रूप में आप स्पष्ट रूप से सत्यापित कर सकते हैं:

>>> import dis 
>>> dis.dis(compile('if x not in d: pass', '', 'exec')) 
    1   0 LOAD_NAME    0 (x) 
       3 LOAD_NAME    1 (d) 
       6 COMPARE_OP    7 (not in) 
       9 JUMP_IF_FALSE   4 (to 16) 
      12 POP_TOP    
      13 JUMP_FORWARD    1 (to 17) 
     >> 16 POP_TOP    
     >> 17 LOAD_CONST    0 (None) 
      20 RETURN_VALUE   
>>> dis.dis(compile('if not x in d: pass', '', 'exec')) 
    1   0 LOAD_NAME    0 (x) 
       3 LOAD_NAME    1 (d) 
       6 COMPARE_OP    7 (not in) 
       9 JUMP_IF_FALSE   4 (to 16) 
      12 POP_TOP    
      13 JUMP_FORWARD    1 (to 17) 
     >> 16 POP_TOP    
     >> 17 LOAD_CONST    0 (None) 
      20 RETURN_VALUE   

इतनी स्पष्ट रूप से वे शब्दार्थतः पहचान कर रहे हैं।

शैली के मामले में, PEP 8 इस मुद्दे का उल्लेख नहीं करता है। यह तुरंत स्पष्ट है कि not in एक भी ऑपरेटर, और "अंग्रेजी की तरह लिखा है" है कि बनाता है -

व्यक्तिगत रूप से, मैं दृढ़ता से if x not in y रूप पसंद करते हैं। if not x in y कुछ पाठकों को सोचने में गुमराह कर सकता है इसका मतलब है if (not x) in y, अंग्रेजी की तरह थोड़ा कम पढ़ता है, और इसमें बिल्कुल कोई क्षतिपूर्ति फायदे नहीं हैं।

1

यह सिर्फ व्यक्तिगत वरीयता है। आप if x != 3 और if not x == 3 की तुलना भी कर सकते हैं। आपके द्वारा दिखाए गए दो अभिव्यक्तियों के बीच कोई अंतर नहीं है।

+10

वे समान नहीं हैं। '! =' कॉल '__ne__' और '==' कॉल '__eq__'। प्रतिकूल मामलों में आपके उदाहरणों के अलग-अलग परिणाम हो सकते हैं –

+1

पर्याप्त सत्य। मुझे जोड़ा जाना चाहिए था, "एक तरफ विकृत"! –

4

not x in L स्पष्ट रूप से अस्वीकृत नहीं है क्योंकि यह मूर्खतापूर्ण होगा। x not in L स्पष्ट रूप से अनुमति है (हालांकि यह एक ही बाइटकोड में संकलित है) क्योंकि यह अधिक पठनीय है।

x not in L जो भी हर कोई उपयोग करता है, हालांकि।

3

जब आप a not in b बारे में यह, not in ऑपरेटर का उपयोग किया जाता है जबकि not a in bin ऑपरेटर का उपयोग करता है और उसके बाद परिणाम को नकारता। लेकिन not in ऑपरेटर को not a in b के रूप में वापस करने के लिए परिभाषित किया गया है, इसलिए वे वही काम करते हैं। documentation से:

ऑपरेटरों in और संग्रह के लिए सदस्यता not in परीक्षण। x in s सत्य पर मूल्यांकन करता है यदि x संग्रह s संग्रह का सदस्य है, और अन्यथा झूठा है। x not in sx in s की अस्वीकृति देता है।

इसी तरह a is not b बनाम not a is b है।

अतिरिक्त वाक्यविन्यास जोड़ा गया था क्योंकि यह मानव को स्वाभाविक रूप से इसे पढ़ने में आसान बनाता है।

+1

अजीब हिस्सा तब होता है जब आप 'डी' मॉड्यूल का उपयोग करते हैं, यह दिखाता है कि दोनों दस्तावेज़ों के बावजूद 'इन नहीं' का उपयोग करके तुलना करते हैं ... – avacariu

6
>>> dis.dis(lambda: a not in b) 
1   0 LOAD_GLOBAL    0 (a) 
      3 LOAD_GLOBAL    1 (b) 
      6 COMPARE_OP    7 (not in) 
      9 RETURN_VALUE  

>>> dis.dis(lambda: not a in b) 
1   0 LOAD_GLOBAL    0 (a) 
      3 LOAD_GLOBAL    1 (b) 
      6 COMPARE_OP    7 (not in) 
      9 RETURN_VALUE 

जब आप करते हैं "एक ख में नहीं" इसके लिए परिवर्तित होगा की जरूरत हो (नहीं) में

हां, सही तरीका है "ख में एक नहीं"।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^