पायथन में "(1,) == 1," का क्या अर्थ है?


119

मैं टपल संरचना का परीक्षण कर रहा हूं, और मैंने पाया कि जब मैं ==ऑपरेटर का उपयोग करता हूं तो यह अजीब लगता है:

>>>  (1,) == 1,
Out: (False,)

जब मैं इन दो अभिव्यक्तियों को एक चर में निर्दिष्ट करता हूं, तो परिणाम सत्य है:

>>> a = (1,)
>>> b = 1,
>>> a==b
Out: True

यह प्रश्न मेरे विचार में पाइथन ट्यूपल ट्रेलिंग कॉमा सिंटैक्स नियम से अलग है । मैं ==ऑपरेटर के बीच अभिव्यक्ति के समूह से पूछता हूं ।


16
2 घंटे पहले ओपी द्वारा एक पिछले प्रश्न को देखते हुए , यह आश्चर्यजनक (या अजीब) लगता है कि कैसे एक प्रश्न को केवल अलग तरीके से तैयार करने से विभिन्न परिणाम हो सकते हैं (और समुदाय के बीच स्वीकृति)।
AKS

24
@AK ये अलग-अलग क़िस्से हैं
kamaork

7
@AKS यहाँ प्रश्न कुछ भिन्न हैं, मैं आपकी बात से पूरी तरह सहमत हूँ। झुंड प्रभाव उर्फ ​​एचएनक्यू।
इन्सेन

5
@PythonNewHand वास्तव में, यह पूरी तरह से स्वीकार्य है। इसलिए मैंने कहा कि एक प्रश्न को अलग ढंग से तैयार करना
एकेएस

3
@CiroSantilli 巴拿馬 文件 ill ill you आप कैसे आंकते हैं? मैंने उन उत्तरों को स्किम किया और कुछ भी नहीं देखा जो इस विशेष स्थिति को कवर करने के लिए लगता था।
डैन गेट्ज़ २०'१६ को

जवाबों:


88

अन्य उत्तर आपको पहले ही दिखा चुके हैं कि व्यवहार ऑपरेटर की पूर्ववर्ती स्थिति के कारण है, जैसा कि यहां दस्तावेज किया गया है

मैं आपको यह दिखाने जा रहा हूं कि अगली बार जब आप इस सवाल के समान हैं, तो इसका उत्तर कैसे मिलेगा। आप astमॉड्यूल के उपयोग से अभिव्यक्ति को कैसे पार्स कर सकते हैं :

>>> import ast
>>> source_code = '(1,) == 1,'
>>> print(ast.dump(ast.parse(source_code), annotate_fields=False))
Module([Expr(Tuple([Compare(Tuple([Num(1)], Load()), [Eq()], [Num(1)])], Load()))])

इससे हम देख सकते हैं कि टिम पीटर्स के समझाने के अनुसार कोड पार्स हो गया :

Module([Expr(
    Tuple([
        Compare(
            Tuple([Num(1)], Load()), 
            [Eq()], 
            [Num(1)]
        )
    ], Load())
)])

1
एक अन्य उपयोगी उपकरण है dis- इस मामले में, आपको दो LOAD_CONSTअलग-अलग मान ( (1,)और 1) और एक BUILD_TUPLEउत्पीड़न-कोड दिखाई देंगे ।
mgilson

153

यह सिर्फ ऑपरेटर की मिसाल है। अपनी पहली

(1,) == 1,

समूह जैसे:

((1,) == 1),

तो एक तत्व के साथ एक तत्व के साथ एक ट्यूपल बनाता है समानता के लिए 1,पूर्णांक के 1लिए एक तत्व टपल की तुलना में वे समान नहीं हैं, इसलिए आपको False,परिणाम के लिए 1-ट्यूपल मिलता है ।


61
वास्तव में नहीं, लेकिन 1-ट्यूपल्स में विषम सिंटैक्स होता है। सामान्य तौर पर, आप कहीं अधिक है, हैरानी होगी, जैसे 1+2, 2==3, 4*7किया नहीं समूह के रूप में (1+2), (2==3), (4*7)। व्यवहार में, 1-टुपल्स शायद ही कभी उपयोग किए जाते हैं (अच्छी तरह से, स्टैकऑवरफ्लो प्रश्नों; ;-)) के बाहर।
टिम पीटर्स

6
शायद "अनपेक्षित" "अजीब" की तुलना में उपयोग करने के लिए एक बेहतर शब्द होगा। मुझे ऐसा लगता है कि मैं उन चित्रों में से एक को देख रहा हूं जो आपके दृष्टिकोण और फोकस के आधार पर दो चीजें हो सकती हैं । समानता ऑपरेटर कॉमा की तुलना में बहुत बड़ा है, इस पर ध्यान केंद्रित करना आसान है और मान लें कि परिणाम होगा True/ False। अब जब मैं समझ गया कि क्या हो रहा है, यह पूरी तरह से स्पष्ट और उचित है।
skrrgwasme

31
और अब आप जानते हैं कि "ज़ेन ऑफ़ पायथन" का अर्थ क्या है कि यह करने का एक स्पष्ट तरीका "यह पहली बार में स्पष्ट नहीं हो सकता है जब तक कि आप डच न हों" ;-)
टिम पीटर्स

7
जब आप डॉक्टर को पढ़ते हैं तो यह थोड़ा भ्रमित होता है और देखते हैं कि क्या एक टपल बनाता है अल्पविराम, कोष्ठक नहीं! इसलिए इस कथन में दाहिने हाथ में अल्पविराम को परीक्षण का हिस्सा नहीं माना जाता है, लेकिन इसे एक विभाजक के रूप में माना जाता है! अप्रत्याशित व्यवहार!
इकरा_5

3
अभिव्यक्ति के बारे में सामान्य सलाह "जब संदेह में हो, कोष्ठक का उपयोग करें"। इसके बाद, सभी एक-ट्यूपलों के आसपास कोष्ठकों को रखना अच्छा है, भले ही वे टुपल सिंटैक्स का हिस्सा न हों।
nigel222

12

जब तुम करोगे

>>> (1,) == 1,

यह एक पूर्णांक के साथ टपल की तुलना करने के परिणाम के साथ एक ट्यूपल बनाता है और इस प्रकार वापस लौटता है ।(1,)False

इसके बजाय जब आप चर को निर्दिष्ट करते हैं, तो दो समान टुपल्स की एक दूसरे के साथ तुलना की जाती है।

तुम कोशिश कर सकते हो:

>>> x = 1,
>>> x
(1,)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.