क्यों (1 में [1,0] == सच) गलत मूल्यांकन करते हैं?


153

जब मैं इस प्रश्न का उत्तर देख रहा था , तो मैंने पाया कि मुझे अपना उत्तर समझ में नहीं आया है।

मुझे वास्तव में समझ नहीं आया कि यह कैसे पार्स किया जा रहा है। दूसरा उदाहरण गलत क्यों लौटाता है?

>>> 1 in [1,0]             # This is expected
True
>>> 1 in [1,0] == True     # This is strange
False
>>> (1 in [1,0]) == True   # This is what I wanted it to be
True
>>> 1 in ([1,0] == True)   # But it's not just a precedence issue!
                           # It did not raise an exception on the second example.

Traceback (most recent call last):
  File "<pyshell#4>", line 1, in <module>
    1 in ([1,0] == True)
TypeError: argument of type 'bool' is not iterable

किसी भी मदद के लिए धन्यवाद। मुझे लगता है कि मुझे कुछ स्पष्ट याद आ रहा है।


मुझे लगता है कि यह लिंक किए गए डुप्लिकेट से बिल्कुल अलग है:

क्यों अभिव्यक्ति 0 <0 == 0 अजगर में झूठी वापसी करता है?

दोनों प्रश्न अभिव्यक्ति की मानवीय समझ के साथ करने हैं। अभिव्यक्ति के मूल्यांकन के दो तरीके (मेरे दिमाग में) प्रतीत हो रहे थे। बेशक न तो सही थे, लेकिन मेरे उदाहरण में, अंतिम व्याख्या असंभव है।

को देखते हुए 0 < 0 == 0आप प्रत्येक आधा मूल्यांकन किया जा रहा कल्पना कर सकता है और अभिव्यक्ति के रूप में अर्थ निकालने:

>>> (0 < 0) == 0
True
>>> 0 < (0 == 0)
True

इसलिए लिंक उत्तर देता है कि यह मूल्यांकन क्यों करता है False:

>>> 0 < 0 == 0
False

लेकिन मेरे उदाहरण के साथ 1 in ([1,0] == True)एक अभिव्यक्ति के रूप में कोई मतलब नहीं है, इसलिए वहाँ के बजाय दो (आमतौर पर गलत) संभव व्याख्याएं, केवल एक संभव लगता है:

>>> (1 in [1,0]) == True

1
संचालक पूर्ववर्ती ... की ==तुलना में तंग करता है in, इसलिए [1,0] == Trueपहले मूल्यांकन किया जाता है, फिर उसी का परिणाम खिलाया जाता है 1 in other_result
मार्क बी

मैंने पायथन-2.7 टैग को हटा दिया है, क्योंकि पायथन 3.2 उसी तरह व्यवहार करता है।
पीवीसी

1
@ मर्क बी: दूसरी अभिव्यक्ति की व्याख्या नहीं करता
स्कॉट हंटर

32
@MarcB, प्रश्न में उस व्याख्या को खारिज करने के लिए कोष्ठक का उपयोग कर एक परीक्षण शामिल था।
मार्क रैनसम

जवाबों:


194

पायथन वास्तव में यहां तुलना करने वाले तुलनात्मक ऑपरेटर को लागू करता है। अभिव्यक्ति का अनुवाद है

(1 in [1, 0]) and ([1, 0] == True)

जो जाहिर है False

यह भी जैसे भावों के लिए होता है

a < b < c

जिसका अनुवाद करें

(a < b) and (b < c)

( bदो बार मूल्यांकन किए बिना )।

देखें अजगर भाषा प्रलेखन अधिक जानकारी के लिए।


40
इसके लिए अतिरिक्त प्रमाण, का 1 in [1, 0] == [1, 0]मूल्यांकन करता है True
एंड्रयू क्लार्क

9
मैं एक भाषा मस्सा के रूप में लंबे समय के बारे में सोचा है। मैं पसंद करूंगा कि inऑपरेटर की तुलना अन्य ऑपरेटरों की तुलना में अधिक है और यह श्रृंखला नहीं है। लेकिन शायद मुझे एक उपयोग का मामला याद आ रहा है।
स्टीवन रंबलस्की

3
अच्छा कैच, मैंने ऐसा सोचा भी नहीं था। यह बहुत समझ में नहीं आता हैinx < y < zx in y in z
चैनिंग

7
@ उपयोगी: शायद। पठनीय: निश्चित रूप से नहीं। इस सम्मेलन के साथ सामान्य गणितीय टाइपोग्राफी का अनुकरण करने के लिए अजगर का उद्देश्य है, लेकिन जब inइस के साथ प्रयोग किया जाता है तो अब ऐसा नहीं होता है और यह काफी जवाबी होता है।
कोनराड रुडोल्फ

6
@KonradRudolph: मैंने देखा है कि गणितीय ग्रंथों में "1 ∈ x ℝ rad" एक से अधिक बार लगता है, लेकिन मैं मूल रूप से आपके साथ सहमत हूं।
स्वेन मार्नाच
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.