2014-04-09 26 views
8

सरणी स्लाइसिंग के साथ खेलते समय मैंने देखा कि a[index:] or a[:index] स्लाइसिंग का प्रकार तारों के लिए बाध्य त्रुटि से सरणी अनुक्रमणिका उत्पन्न नहीं करता है।क्यों पाइथन की सूची स्लाइसिंग बाध्य त्रुटि से सूचकांक उत्पन्न नहीं करती है?

str = "abcde" 
print str[10:] 
print str[:10] 

का उत्पादन उत्पादन:

'' 
abcde 

किसी को भी व्याख्या कर सकते हैं क्यों? क्या यह सीमा त्रुटि से सरणी अनुक्रमणिका उत्पन्न नहीं करना चाहिए? यदि मैं कुछ ऐसा करने की कोशिश करता हूं तो पाइथन इस त्रुटि का उत्पादन करता है: print str[10]

+0

@ विक्रेता: सूचक के लिए धन्यवाद – tejas

उत्तर

11

स्लाइसिंग का उपयोग नई सूची बनाने के लिए किया जाता है। यदि सूचकांक सूची में तत्वों की संख्या के भीतर नहीं आते हैं, तो हम एक खाली सूची वापस कर सकते हैं। तो, हमें एक त्रुटि फेंकने की जरूरत नहीं है।

लेकिन, यदि हम सूची में तत्वों तक पहुंचने का प्रयास करते हैं जो तत्वों की संख्या से अधिक है, तो हम किसी भी डिफ़ॉल्ट मान को वापस नहीं कर सकते हैं (यहां तक ​​कि None भी नहीं क्योंकि यह सूची में मान्य मान हो सकता है)। यही कारण है कि

IndexError: list index out of range 

फेंक दिया गया है।

टुकड़ा करने की क्रिया है, अगर प्रारंभिक सूचकांक से अधिक या अनुक्रम की लंबाई के बराबर है, लौटे अनुक्रम की लंबाई 0 होने के लिए, सेट किया गया है इस line

defstop = *step < 0 ? -1 : length; 
... 
if (r->stop == Py_None) { 
    *stop = defstop; 
} 
... 
if ((*step < 0 && *stop >= *start) 
    || (*step > 0 && *start >= *stop)) { 
    *slicelength = 0; 

में स्ट्रिंग्स के लिए, यदि स्लाइसिंग के बाद लौटने के लिए स्ट्रिंग की लंबाई 0 है, फिर यह this line

if (slicelength <= 0) { 
    return PyString_FromStringAndSize("", 0); 
} 
1

इस प्रकार स्लाइसिंग ऑपरेटर को अजगर में कार्यान्वित किया जाता है। यदि सरणी सूचकांक सीमा से बाहर हैं, तो यह सही जगहों पर स्वचालित रूप से छंटनी होगी।

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