2013-10-22 19 views
5

मैं बस का सामना करना पड़ा निम्नलिखित और अजगर के व्यवहार के बारे में उत्सुक हूँ:आदेश

>>> x = 1 
>>> x in range(2) 
True 
>>> type(x in range(2)) 
<type 'bool'> 
>>> x in range(2) == True 
False 
>>> x in range(2) == False 
False 
>>> (x in range(2)) == True 
True 

विशेष रूप से, क्यों (1 in range(2)) == True मूल्यांकन करता है True और l in range(2) == TrueFalse का मूल्यांकन? ऐसा लगता है कि वहाँ बाद में मूल्यांकन व्यवहार के कुछ अजीब आदेश है, सिवाय इसके कि यदि आप स्पष्ट रूप से गलत करते हैं तो आप एक TypeError मिलती है:

>>> x in (range(2) == True) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: argument of type 'bool' is not iterable 

रिकॉर्ड के लिए, मैं किसी भी मामले नहीं जानता कि मैं कहाँ x in range (2) के बजाय x in range(2) == True का उपयोग करेगा, लेकिन यह जानना होगा कि यह क्यों हो रहा है। मैंने इसे पायथन 2.7 और पायथन 3 दोनों में भी परीक्षण किया, और व्यवहार वही है।

उत्तर

4

नीचे अभिव्यक्ति:

x in range(2) == True 

तुलना श्रृंखलित है, और के रूप में मूल्यांकन किया जाता है:

x in range(2) and range(2) == True 

जो आप Falserange(2) == True के रूप में दे देंगे False लिए मूल्यांकन किया जाता है। Comparison के लिए दस्तावेज़ देखें:

तुलना मनमाने ढंग से श्रृंखलित जा सकता है, जैसे, x < y <= z सिवाय इसके कि y केवल एक बार मूल्यांकन किया जाता है (लेकिन जब x < y झूठी पाई जाती है दोनों ही मामलों में z सब पर मूल्यांकन नहीं किया जाता है, x < y and y <= z के बराबर है)।

+0

अच्छी अंतर्दृष्टि! किसी कारण से मैंने कभी नहीं सोचा था कि आप अन्य ऑपरेटरों के साथ 'इन' चेन कर सकते हैं। – mdml

3

== समानता और in सदस्यता ऑपरेटरों दोनों comparison operators हैं, और ये श्रृंखलित हो सकता है।

चेनिंग expr1 op1 expr2 op2 expr3 का रूप लेता है, जिसे (expr1 op1 expr2) and (expr2 op2 expr3) के रूप में समझा जाता है लेकिन मध्य expr2 का मूल्यांकन केवल एक बार किया जाता है।

तो, अपने उदाहरण वास्तव में कर रहे हैं:

x in range(2) and range(2) == True 

और range(2) एक बूलियन मान के बराबर नहीं है।

ध्यान दें कि आपको वास्तव में == True या == False से तुलना नहीं करना चाहिए। के लिए का परीक्षण करने के लिए while या if पर जाएं।

-1

मुझे लगता है कि आप वास्तव में केवल range(2) भाग का मूल्यांकन कर रहे हैं, यदि आप इसे दुभाषिया में आज़माते हैं तो आपको यह मिलता है।

>>> range(2) == True 
>>> False