इंडेक्सिंग के साथ स्लाइसिंग को रेंज वर्क से बाहर क्यों रखा जाता है?


88

'example'[999:9999]परिणाम में त्रुटि क्यों नहीं है ? चूंकि 'example'[9], इसके पीछे क्या प्रेरणा है?

इस व्यवहार से मैं यह मान सकता हूं कि 'example'[3]अनिवार्य रूप से / आंतरिक रूप से 'example'[3:4], समान नहीं है , भले ही दोनों एक ही 'm'स्ट्रिंग में परिणाम करते हैं ।


17
[999:9999]एक सूचकांक नहीं है, यह एक टुकड़ा है, और अलग शब्दार्थ है। अजगर इंट्रो से: "पतले स्लाइस इंडेक्स को इनायत से संभाला जाता है: एक इंडेक्स जो बहुत बड़ा होता है, उसे स्ट्रिंग साइज से बदल दिया जाता है, जो निचले बाउंड की तुलना में एक ऊपरी बाउंड एक खाली स्ट्रिंग देता है।"
वुज़

2
@Wooble वह वास्तविक उत्तर है
jondavidjohn

2
@Ooble और क्या आप जानते हैं कि यह ऐसा क्यों है? अपने स्पष्टीकरण के लिए धन्यवाद।
इजेविग

क्यों? आपको गुइडो से पूछना होगा, लेकिन मुझे लगता है कि यह एक टुकड़ा मानने में सक्षम होना सुरुचिपूर्ण है हमेशा मूल अनुक्रम के रूप में उसी तरह का अनुक्रम होता है, खुद।
Wooble

1
@ लैपिनॉट हाँ मैंने कोड लिखा है जो इस व्यवहार पर निर्भर करता है। दुर्भाग्य से मुझे सटीक कोड याद नहीं है इसलिए मैं आपको बता नहीं सकता कि क्यों। शायद सबस्ट्रिंग के साथ करना था; खाली स्ट्रिंग प्राप्त करना वैसा ही हो सकता है जैसा आप कभी-कभी चाहते हैं।
मार्क रैनसम

जवाबों:


68

तुम सही हो! 'example'[3:4]और 'example'[3]मौलिक रूप से अलग हैं, और एक अनुक्रम की सीमा के बाहर स्लाइसिंग (कम से कम बिल्ट-इन के लिए) त्रुटि का कारण नहीं है।

यह पहली बार में आश्चर्यजनक हो सकता है, लेकिन जब आप इसके बारे में सोचते हैं तो यह समझ में आता है। इंडेक्सिंग किसी एक आइटम को लौटाता है, लेकिन स्लाइसिंग के बाद आइटम की वापसी होती है। इसलिए जब आप एक शून्य मान को अनुक्रमित करने का प्रयास करते हैं, तो लौटने के लिए कुछ भी नहीं होता है। लेकिन जब आप किसी क्रम को सीमा से बाहर कर देते हैं, तब भी आप एक खाली क्रम वापस कर सकते हैं।

यहाँ क्या भ्रमित किया जा रहा है इसका एक हिस्सा सूचियों से थोड़ा अलग व्यवहार करता है। जब आप सूची में समान कार्य करते हैं तो देखें:

>>> [0, 1, 2, 3, 4, 5][3]
3
>>> [0, 1, 2, 3, 4, 5][3:4]
[3]

यहाँ अंतर स्पष्ट है। स्ट्रिंग्स के मामले में, परिणाम समान प्रतीत होते हैं क्योंकि पायथन में, स्ट्रिंग के बाहर व्यक्तिगत चरित्र जैसी कोई चीज नहीं है। एक एकल चरित्र सिर्फ 1-वर्ण स्ट्रिंग है।

(एक अनुक्रम की सीमा के बाहर टुकड़ा करने के सटीक शब्दार्थ के लिए, mgilson का उत्तर देखें ।)


1
सीमा से बाहर का एक इंडेक्स आउट करने के Noneबजाय वापस आ सकता है - यह सामान्य पायथन सम्मेलन है जब आपके पास वापस लौटने के लिए कुछ नहीं है।
मार्क रैनसम

8
@MarkRansom, यह सच है; लेकिन Noneइस मामले में लौटने से सूची के बाहर के सूचकांक और Noneमूल्य के बीच बताना कठिन हो जाएगा । लेकिन उसके लिए वर्कअराउंड होने के बावजूद, यह मेरे लिए स्पष्ट है कि खाली क्रम को वापस करना सही बात है जब आउट-ऑफ-बाउंड स्लाइस दिया जाता है। यह दो निराशाजनक सेटों के मिलन के अनुरूप है।
प्रेषित

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

1
@MarkRansom, मुझे पता है - अगर मुझे रक्षात्मक लगता है तो मुझे खेद है। वास्तव में मैं सिर्फ एक सिद्धांत सेट करने के लिए बहाना चाहता था :)।
23

4
अजी, सिवाय इसके कि मैंने "चौराहे" के बजाय "संघ" कहा।
प्रेषक

31

एक जवाब जोड़ने के लिए जो दस्तावेज़ में एक मजबूत खंड की ओर इशारा करता है :

एक स्लाइस अभिव्यक्ति को देखते हुए s[i:j:k],

का टुकड़ा रों से मैं करने के लिए जे कदम के साथ कश्मीर सूचकांक के साथ वस्तुओं के अनुक्रम के रूप में परिभाषित किया गया है x = i + n*kऐसा है कि 0 <= n < (j-i)/k। दूसरे शब्दों में, सूचकांक हैं i, i+k, i+2*k, i+3*kऔर इतने पर, रोक जब जे तक पहुँच जाता है (लेकिन कभी नहीं सहित जे )। जब k पॉजिटिव होता है, तो i और j कम हो len(s)जाते हैं, यदि वे अधिक होते हैं

यदि आप लिखते हैं s[999:9999], अजगर आपके s[len(s):len(s)]बाद से लौट रहा है len(s) < 999और आपका कदम सकारात्मक है ( 1- डिफ़ॉल्ट)।


संभवत: जब kसकारात्मक है, iऔर जब वे कम होते हैं तो jभी बढ़ -len(s)जाते हैं? जैसेs = 'bac'; s[-100:2] == s[-len(s):2]
क्रिस_रैंड्स

@Chris_Rands जब kसकारात्मक होता है, तो पायथन पैमाने iऔर jइतना होगा कि वे अनुक्रम की सीमा में फिट होते हैं। अपने उदाहरण में, s[-100:2] == s[0:2]( == s[-len(s):2], वैसे)। इसी तरह, s[-100:100] == s[0:2]
tylerc0816

अच्छा धन्यवाद। यह @ स्पीडप्लेन की टिप्पणी के ऊपर एक बेहतर प्रतिक्रिया है।
प्रेषक

8

अंतर्निहित प्रकारों से स्लाइसिंग की सीमा नहीं है। और यद्यपि आपके दोनों उदाहरणों में समान परिणाम दिखाई देते हैं, वे अलग तरह से काम करते हैं; इसके बजाय उन्हें एक सूची के साथ आज़माएं।

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