2011-04-19 12 views
19

मुझे पता है कि अगर जब मैं की तरहक्या पायथन स्ट्रिंग पर स्लाइस-बाय-रेफरेंस करता है?

a = "This could be a very large string..." 
b = a[:10] 

एक नया स्ट्रिंग बनाई गई है या एक दृश्य/इटरेटर

+0

ध्यान दें कि आप बाद में 'itertools.islice' का उपयोग कर सकते हैं। – delnan

+2

जब आप इसे चलाते थे, और ऑब्जेक्ट पहचान की जांच करने के लिए 'id()' का उपयोग करते थे, तो आपने क्या सीखा? –

+7

@ एसएलओटी: एक दृश्य के पास उस ऑब्जेक्ट के लिए एक अलग 'id()' होगा जिसका दृश्य था। तो यह वास्तव में आपको कुछ भी नहीं सिखाता है। 'टाइप() 'करना अधिक उपयोगी है। –

उत्तर

32

Python does slice-by-copy, जिसका अर्थ है कि आप हर बार टुकड़ा करते हैं (very trivial slices को छोड़कर, a[:]), यह सभी डेटा को एक नई स्ट्रिंग ऑब्जेक्ट में कॉपी करता है।

one of the developers के अनुसार, इस विकल्प क्योंकि

[टुकड़ा-दर-संदर्भ] दृष्टिकोण, और अधिक जटिल कठिन लागू करने के लिए है और अनपेक्षित व्यवहार को जन्म दे सकती बनाया गया था।

उदाहरण के लिए:

 
a = "a long string with 500,000 chars ..." 
b = a[0] 
del a 

टुकड़ा के रूप में प्रति के साथ स्ट्रिंग a तुरंत मुक्त हो जाता है डिजाइन। स्लाइस-ए-रेफरेंस डिज़ाइन 500kB स्ट्रिंग को स्मृति में रखेगा हालांकि आप केवल पहले वर्ण में रूचि रखते हैं।

जाहिर है, अगर आप पूरी तरह जरूरत एक स्ट्रिंग में एक दृश्य के लिए, आप एक memoryview वस्तु का उपयोग कर सकते हैं।

+0

@ ब्लूराजा-डैनी-पीएफएलयूघोफ्ट अन्य संभावित प्रकार के छोटे स्लाइस क्या हैं? – sandeeps

+0

@ सैंडिप्स एकल-बाइट स्लाइस, खाली टुकड़ा – sshilovsky

+0

यदि मैं 'शब्द =' पायथन 'शब्द [2: 3] == शब्द [2: -3]' करता हूं, तो मुझे 'सत्य' मिलता है। और यदि मैं 'आईडी (शब्द [2: 3]) 'और' आईडी (शब्द [2: -3]) की तुलना करता हूं, तो वे वही हैं। इसका मतलब यह है कि स्लाइसिंग के दौरान, पाइथन समान तारों के लिए कुछ आंतरिक काम करता है? – FaithReaper

1

जब आप तार काट दिया जाता है कुछ करना है, वे स्ट्रिंग का एक नया उदाहरण वापसी चाहते हैं। स्ट्रिंग्स अपरिवर्तनीय वस्तुएं हैं।

+4

सच होने पर, यह सवाल का जवाब नहीं देता है: वह पूछ रहा है कि डेटा कॉपी हो गया है या नहीं। –

+1

यह एक कारण है कि आप स्लाइस दृश्यों को _not_ प्रतिलिपि की अपेक्षा करेंगे। अपरिवर्तनीय डेटा के लिए सामान्य उपयोगों में से एक यह है कि इसके बजाय संदर्भ पास करना आसान है। तो मैं उत्सुक हूं क्यों पाइथन में यह एक प्रतिलिपि करता है। – sudo

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