2012-06-22 28 views
15

आज सुबह में, मैं अपने आप को कुछ ऐसा लिख ​​पाते हैं:की श्रंखला के बारे में क्या नियम हैं "==" और अजगर

if (a == b == c): 
    # do something 

और आश्चर्य है कि यह मुझे अपेक्षित परिणाम दिया।

मैंने सोचा था कि के रूप में यह कैसा व्यवहार करेंगे:

if ((a == b) == c): 
    # do something 

लेकिन यह स्पष्ट रूप से नहीं किया था। ऐसा लगता है कि पाइथन दूसरे बयान को दूसरे से अलग तरीके से इलाज कर रहा है, जो अच्छा है लेकिन मुझे इसके बारे में कोई दस्तावेज़ीकरण या स्पष्टीकरण नहीं मिला।

मैं परीक्षण किया है और यह मिल गया:

In [1]: 2 == 2 == 2 
Out[1]: True 

In [2]: (2 == 2) == 2 
Out[2]: False 

कोई ध्यान मुझे समझाने के लिए चाहेंगे क्या इस तरह के == (या !=) की "श्रृंखलन" के बारे में नियम हैं?

बहुत बहुत धन्यवाद।

+3

औपचारिक रूप से, यदि ए, बी, सी, ..., वाई, जेड अभिव्यक्तियां और ओपी 1, ओपी 2, ..., ओपीएन तुलना ऑपरेटर हैं, तो एक ओपी 1 बी op2 सी ... y opn z बराबर है एक ओपी 1 बी और बी op2 सी और ... y opn z, सिवाय इसके कि प्रत्येक अभिव्यक्ति का मूल्यांकन सबसे अधिक बार किया जाता है। @ http://docs.python.org/reference/expressions.html – georg

+2

साफ, आह? आप 'a Thomas

+0

नहीं कि मुझे ज्यादा परवाह है, लेकिन क्या डाउनवॉटर समझा सकता है कि वह क्यों नीचे आ गया? – ereOn

उत्तर

24

यह सब तुलना ऑपरेटरों के साथ काम करता है की तरह है की तरह है - जैसे आप भी कर सकते हैं:

>>> 4 < 5 < 6 
True 
>>> 4 < 5 !=2 
True 

सामान्य रूप से, , >, !=, ==, <=, >=, is, is not, in या not in ही परिणाम प्राप्त होगा के रूप में:

a op1 b and b op2 c 

डॉक्स का यह भी कहना है कि इस 210, a op1 b op2 c जहां op1 और op2 के किसी भी कर रहे हैं मनमाने ढंग से कई तुलनाओं के साथ काम कर सकते हैं, इसलिए:

>>> 5 != '5' != 'five' != (3+2) 
True 

जो कभी-कभी थोड़ा भ्रमित परिणाम हो सकता है ऐसा लगता है कि 5 != (3+2) - प्रत्येक ऑपरेंड की तुलना केवल उन सभी के साथ की जाती है, जो सभी संभव संयोजन करने के बजाय, केवल == का उपयोग करके उदाहरणों से स्पष्ट नहीं हो सकते हैं, क्योंकि अगर __eq__ को परिभाषित करता है तो यह उत्तर को प्रभावित नहीं करेगा)।

+0

'इन' और 'इन इन' के लिए भी काम करता है, उदा।[4] में [4] [[4]] '(यह नहीं कि मैं इस उपयोग की सिफारिश कर रहा हूं ...) – interjay

+0

@interjay वास्तव में और वास्तव में जब मैं आपकी टिप्पणी प्रकट हुई तो मैं वास्तव में उन लोगों को संपादित कर रहा था। GMTA। :-) – lvc

+1

स्पष्टीकरण के लिए बहुत बहुत धन्यवाद। इस भाषा के लिए मेरा प्यार दिन के बाद बढ़ता है! ;) – ereOn

12

जहाँ तक मुझे पता के रूप में आप का कहना है उदाहरण के चेनिंग नहीं है।

2 == 2 == 2(2 == 2) and (2 == 2) जो पता चला है होना करने के लिए True and True

जबकि

(2 == 2) == 2(True) == 2

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