दिलचस्प पोस्ट
डीडी में सी # में पासवर्ड रखने के लिए नमक के साथ एमडी 5 हैश Log4j में अपना खुद का एपेन्डर कैसे बना सकता है? उद्देश्य-सी क्लास में C फ़ंक्शन को मिलाकर करना कॉरस पर XMLHttpRequest को समझना (responseText) वैध UUID / GUID का परीक्षण कैसे करें? माउस-ओवर पर सीएसएस और फिर रंग के साथ ग्रेस्केल की छवि? FileSystemWatcher परिवर्तित ईवेंट दो बार उठाया गया है टाइपस्क्रिप्ट में स्ट्रिंग मानों के साथ एक एन्यूम बनाएं जेपीए और सीतनिद्रा में होना – मानदंड बनाम JPQL या HQL यह जाँचने का सबसे अच्छा तरीका क्या है कि स्ट्रिंग जावा में एक पूर्णांक का प्रतिनिधित्व करता है? यूटीसी के कारण जेसनॉन स्ट्रिंग की तिथि का समय बदलता है PHP के साथ पूर्ण पथ से फ़ाइल नाम कैसे प्राप्त करें? एसक्यूएल फ़ाइल को MySQL में आयात करें एक URL के बजाय IFRAME स्रोत के रूप में HTML कोड बीन इनिशियलाइजेशन पूरा होने के बाद किसी विधि को कैसे कॉल करें?

क्यों `एक == बी या सी या डी 'हमेशा सही पर मूल्यांकन करता है?

मैं एक सुरक्षा प्रणाली लिख रहा हूँ जो अनधिकृत उपयोगकर्ताओं तक पहुंच से इनकार करता है।

import sys print("Hello. Please enter your name:") name = sys.stdin.readline().strip() if name == "Kevin" or "Jon" or "Inbar": print("Access granted.") else: print("Access denied.") 

यह अपेक्षित के रूप में अधिकृत उपयोगकर्ताओं तक पहुंच प्रदान करता है, लेकिन यह अनधिकृत उपयोगकर्ताओं को भी देता है!

 Hello. Please enter your name: Bob Access granted. 

ऐसा क्यों होता है? मैं स्पष्ट रूप से केवल पहुंच प्रदान करने के लिए कहा है जब name केविन, जॉन या इनबार के बराबर है मैंने भी विपरीत तर्क की कोशिश की है, if "Kevin" or "Jon" or "Inbar" == name , लेकिन परिणाम एक ही है।

वेब के समाधान से एकत्रित समाधान "क्यों `एक == बी या सी या डी 'हमेशा सही पर मूल्यांकन करता है?"

कई मामलों में, पाइथन प्राकृतिक अंग्रेज़ी की तरह व्यवहार करता है और व्यवहार करता है, लेकिन यह एक ऐसा मामला है जहां अमूर्त विफल हो जाता है। लोगों को यह निर्धारित करने के लिए कि "जॉन" और "इनबार" ऑब्जेक्ट "बराबर" से जुड़े हुए हैं, लेकिन पायथन इंटरप्रिटर अधिक शाब्दिक दिमाग है, यह निर्धारित करने के लिए लोग संदर्भ सूचियों का उपयोग कर सकते हैं।

 if name == "Kevin" or "Jon" or "Inbar": 

तार्किक रूप से इसके बराबर है:

 if (name == "Kevin") or ("Jon") or ("Inbar"): 

जो, बॉब के लिए उपयोगकर्ता के बराबर है:

 if (False) or ("Jon") or ("Inbar"): 

or ऑपरेटर एक सकारात्मक सत्य मूल्य के साथ पहली तर्क का चयन करता है:

 if ("Jon"): 

और चूंकि "जॉन" एक सकारात्मक सत्य मान है, if ब्लॉक निष्पादित होता है। यही कारण है कि दिए गए नाम की परवाह किए बिना मुद्रित होने के लिए "पहुंच प्रदान"

यह सब तर्क अभिव्यक्ति पर भी लागू होता है if "Kevin" or "Jon" or "Inbar" == name । पहला मान, "Kevin" , सच है, इसलिए if ब्लॉक निष्पादित करता है।


इस सशर्त रूप से उचित रूप से निर्माण करने के दो सामान्य तरीके हैं।

  1. प्रत्येक मूल्य के विरुद्ध स्पष्ट रूप से जांचने के लिए कई == ऑपरेटरों का उपयोग करें:
    if name == "Kevin" or name == "Jon" or name == "Inbar":

  2. वैध मानों का अनुक्रम लिखें और सदस्यता के लिए परीक्षा in ऑपरेटर का उपयोग करें:
    if name in ("Kevin", "Jon", "Inbar"):

दोनों के सामान्य रूप में दूसरे को प्राथमिकता दी जानी चाहिए क्योंकि यह पढ़ने और भी तेज़ करना आसान है:

 In [1]: name = "Inbar" In [2]: %timeit name == "Keven" or name == "Jon" or name == "Inbar" 10000000 loops, best of 3: 116 ns per loop In [3]: %timeit name in ("Keven", "Jon", "Inbar") 10000000 loops, best of 3: 65.2 ns per loop