यहां कुछ सबसे आम पायथन प्रोग्रामिंग गलतियां/गॉटचा हैं जो प्रोग्रामर करते हैं:
- स्कोप नाम लुकअप: पायथन LEGB (लोकल, एनक्लोजिंग, ग्लोबल, बिल्ट-इन) के क्रम में स्कोपिंग नियमों का पालन करता है। चूंकि पायथन में सख्त टाइप बाइंडिंग नहीं है, प्रोग्रामर आउटर स्कोप वेरिएबल को किसी अन्य मान से पुनः संबद्ध कर सकते हैं जिसका उपयोग बाद में आउटर स्कोप में किया जा सकता है लेकिन अब किसी अन्य मान से प्रतिस्थापित हो गया है।
- is और == के बीच अंतर न करना: पायथन में is ऑपरेटर जांचता है कि क्या दोनों ऑब्जेक्ट एक ही मेमोरी एड्रेस को संदर्भित करते हैं। == ऑपरेटर __eq__ फ़ंक्शन को एक्जीक्यूट करता है जो अलग-अलग क्लास के लिए समानता की जांच अलग तरह से कर सकता है।
- इटरेट करते समय लिस्ट को मॉडिफाई करना: यदि आप इटरेट करते समय लिस्ट से एलिमेंट हटाते हैं, तो आपको IndexError मिलेगा। ऐसा इसलिए है क्योंकि लिस्ट आकार में कम हो रही है जबकि आप इसके साथ इंडेक्स को कम नहीं कर रहे हैं।
- क्लोजर बाइंडिंग: निम्न कोड पर विचार करें:
उदाहरण
listLambdas = [lambda x : i + x for i in range(5)]
for lam in listLambdas:
print(lam(10))
आउटपुट
यह आउटपुट देगा:
14 14 14 14 14
चौंक गए? यह क्लोजर में बाइंडिंग के कारण है। इस लिस्ट में सभी लैम्ब्डा वेरिएबल i को संदर्भित करते हैं, यानी जब यह बदलता है, तो ये लैम्ब्डा नए मान को संदर्भित करने लगते हैं।
- बिल्ट-इन्स के साथ नाम संघर्ष: आपने अपने जीवन में कभी न कभी sum नामक वेरिएबल बनाया होगा। ध्यान दें कि इस मामले में आपने sum फ़ंक्शन के संदर्भ को पुनः असाइन किया है। यह इस तरह की चीजों के लिए तुच्छ लग सकता है लेकिन जब पैकेज का नाम इस तरह रखा जाता है तो यह कुछ गंभीर समस्याएं पैदा कर सकता है। इससे अन्य पैकेज आपके क्लास को स्टैंडर्ड वाले के बजाय इम्पोर्ट कर सकते हैं।
- ऑपरेटर के लिए अनइंट्यूटिव इम्प्लीमेंटेशन: पायथन क्लास के लिए ऑपरेटर फ़ंक्शन को ओवरलोड करने का एक तरीका प्रदान करता है। अक्सर लोग इन ऑपरेटर को असामान्य तरीके से इम्प्लीमेंट करते हैं और जटिल और अनइंट्यूटिव API बना देते हैं।