2012-03-09 13 views
16

मैं जानता हूँ कि संभावना है कि एक ओर जहां:अजगर स्ट्रिंग से पिछले चार निकालें और लौट यह

>>> a = "abc" 
>>> result = a[-1] 
>>> a = a[:-1] 

अब मुझे यह भी पता है कि तार अपरिवर्तनीय है और इसलिए कुछ इस तरह हैं:

>>> a.pop() 
c 

है संभव नहीं।

लेकिन क्या यह वास्तव में पसंदीदा तरीका है?

+0

मैंने जोड़ने की कोशिश की, यह नहीं पता कि यह क्यों काम नहीं करता है। –

+2

यह वास्तव में इस बात पर निर्भर करता है कि आप क्या करने का प्रयास कर रहे हैं और कोड को अनुकूलित करना कितना महत्वपूर्ण है। मुझे लगता है कि ज्यादातर मामलों में बस एक और प्रकार बनाने या सूची का उपयोग करने के बजाय, एक नई स्ट्रिंग को प्राथमिकता दी जाती है। – dave

+0

यदि आपको इसे अक्सर करना है, तो अपने एल्गोरिदम पर पुनर्विचार करें। – delnan

उत्तर

27

स्ट्रिंग अच्छे कारण के लिए "अपरिवर्तनीय" हैं: यह वास्तव में बहुत से सिरदर्द बचाता है, जो आपको लगता है उससे अधिक बार। यह पाइथन को उनके उपयोग को अनुकूलित करने के बारे में बहुत स्मार्ट होने की अनुमति देता है। आप बढ़ोतरी के साथ अपनी स्ट्रिंग कार्रवाई करने के लिए चाहते हैं, आप split() साथ इसका हिस्सा बाहर खींच या सूचकांक का उपयोग कर दो भागों में अलग कर सकते हैं:

a = "abc" 
a, result = a[:-1], a[-1] 

यह दिखाता है कि आप दो में अपने स्ट्रिंग बंटवारे रहे हैं।आप स्ट्रिंग के हर बाइट की जांच हो जाएगा, तो आप (, रिवर्स में यदि आप चाहें) इस पर पुनरावृति कर सकते हैं:

for result in reversed(a): 
    ... 

मैं जोड़ने चाहिए यह एक छोटे से काल्पनिक लगता है: आपका स्ट्रिंग अधिक कुछ होने की संभावना है विभाजक, और फिर आप split का उपयोग करेंगे:

ans = "foo,blah,etc." 
for a in ans.split(","): 
    ... 
5

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

आप सोच रहे होंगे कि तार क्यों अपरिवर्तनीय हैं, बशर्ते कि जब भी आप कोई चरित्र बदलते हैं तो आपको एक पूरी नई स्ट्रिंग बनाना होगा। आखिरकार, सी स्ट्रिंग सिर्फ वर्णों के सरणी हैं और इस प्रकार उत्परिवर्तनीय हैं, और कुछ भाषाएं जो सी से अधिक स्पष्ट रूप से तारों का समर्थन करती हैं, उत्परिवर्तनीय तारों को भी अनुमति देती हैं। अपरिवर्तनीय तार रखने के दो कारण हैं: सुरक्षा/सुरक्षा और प्रदर्शन।

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

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

एरिक लिपर्ट स्ट्रिंग्स के अपरिवर्तनीय (सी # में, पायथन नहीं) here के पीछे तर्क के बारे में और बताता है।

1

हां, अजगर तार अपरिवर्तनीय हैं और किसी भी संशोधन के परिणामस्वरूप एक नई स्ट्रिंग बन जाएगी। इस तरह यह ज्यादातर किया जाता है।

तो, इसके साथ आगे बढ़ें।

3

सवाल का सटीक शब्दों मुझे लगता है कि यह असंभव है बनाता है।

return मेरे लिए मतलब है कि आपके पास एक फ़ंक्शन है, जिसे आपने पैरामीटर के रूप में एक स्ट्रिंग पास कर दी है।

आप इस पैरामीटर को नहीं बदल सकते हैं। इसे असाइन करने से फ़ंक्शन में पैरामीटर का मान केवल तभी बदल जाएगा, न कि स्ट्रिंग में पारित। जैसे

>>> def removeAndReturnLastCharacter(a): 
     c = a[-1] 
     a = a[:-1] 
     return c 

>>> b = "Hello, Gaukler!" 
>>> removeAndReturnLastCharacter(b) 
! 

>>> b # b has not been changed 
Hello, Gaukler! 
संबंधित मुद्दे