2012-02-28 10 views
41

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

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

+9

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

+0

@Wooble जो वास्तविक उत्तर है – jondavidjohn

+1

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

उत्तर

5

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

31

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

यह भी ध्यान रखें कि x[3] और x[3:4] के बीच सामान्य में एक अंतर है। उदाहरण के लिए:

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

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

+1

रेंज से बाहर एक सूचकांक त्रुटि के बजाय 'कोई नहीं' वापस कर सकता था - यह सामान्य पाइथन सम्मेलन है जब आपके पास वापस आने के लिए कुछ भी नहीं है। –

+3

@MarkRansom, यह सच है; लेकिन इस मामले में 'कोई नहीं' लौटने से एक सूची के बाहर एक सीमा के सूचकांक और 'कोई नहीं' मूल्य के बीच बताना मुश्किल हो जाएगा। लेकिन यहां तक ​​कि अगर इसके लिए कोई कामकाज भी था, तो यह मेरे लिए स्पष्ट है कि एक खाली अनुक्रम लौटने पर सही काम करना सही होता है जब बाहर की सीमा का टुकड़ा दिया जाता है। यह दो अपमान सेटों के संघ का प्रदर्शन करने के समान है। – senderle

+0

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

8

एक जवाब है कि documentation में एक मजबूत अनुभाग के लिए अंक जोड़ने की खातिर:

s[i:j:k] की तरह एक टुकड़ा अभिव्यक्ति को देखते हुए,

The slice of s from i to j with step k is defined as the sequence of items with index x = i + n*k such that 0 <= n < (j-i)/k. In other words, the indices are i, i+k, i+2*k, i+3*k and so on, stopping when j is reached (but never including j). When k is positive, i and j are reduced to len(s) if they are greater

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

+0

संभवतः जब 'के' सकारात्मक होता है, तो' i' और 'j'' कम होने पर '-लेन' में भी बढ़े जाते हैं? जैसे 'एस = 'बीएसी'; रों [-100: 2] == रों [-len (ओं): 2] ' –

+0

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

संबंधित मुद्दे