2011-12-30 27 views
35
  1. का उपयोग करने के लिए सर्वोत्तम अभ्यास पाइथन स्ट्रिंग को अपरिवर्तनीय बनाने के डिज़ाइन कारण क्या हैं? यह प्रोग्रामिंग को आसान कैसे बनाता है?
  2. मैं सी में से जैसे म्यूटेबल तारों के लिए उपयोग किया जाता है। मुझे म्यूटेबल तारों के बिना प्रोग्राम कैसे करना चाहिए? क्या कोई सर्वोत्तम प्रथा है?
+1

एक परिवर्तनीय स्ट्रिंग प्रकार है, इसे ['bytearray'] कहा जाता है (http://docs.python.org/library/functions.html#bytearray) –

+5

@JanneKarila: हालांकि, अर्थशास्त्र, जंगली रूप से अलग हैं। उदाहरण के लिए, यह यूनिकोड वर्णों को केवल बाइट्स को संभाल नहीं करता है। यह एक उचित स्ट्रिंग नहीं है - स्ट्रिंग विधियों के साथ - यह बाइट्स की समायोज्य सरणी है। –

उत्तर

37

में तार के साथ जुड़े अत्यधिक दर्द की तुलना में आसान है, है, तो आप यकीन है कि यह पहले जैसा ही हो सकेंगे। मान लीजिए कि आप एक स्ट्रिंग तर्क के साथ नीचे Foo का निर्माण करेंगे, और फिर स्ट्रिंग को संशोधित करेंगे; तो Foo के नाम अचानक बदल जाएगा:

class Foo(object): 
    def __init__(self, name): 
     self.name = name 

name = "Hello" 
foo = Foo(name) 
name[0] = "J" 

परिवर्तनशील तार के साथ, आप हर समय होने से बुरी बातों को रोकने के लिए प्रतियां बनाने होगा।

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

और आखिरकार, यदि स्ट्रिंग्स अपरिवर्तनीय नहीं थे, तो आप dict में चाबियों के रूप में विश्वसनीय रूप से उनका उपयोग नहीं कर पाएंगे, क्योंकि उनके हैश मान अचानक बदल सकते हैं।

अपरिवर्तनीय तारों के साथ प्रोग्रामिंग के लिए, केवल उन तरीकों का इलाज करने के लिए उपयोग करें जैसे आप संख्याओं का इलाज करते हैं: मूल्य, वस्तुओं के रूप में नहीं। name के पहले अक्षर को बदलने हो

name = "J" + name[1:] 
+3

Sooooooo मुझे पता है कि यह थोड़ा देर हो चुकी है, लेकिन क्या आप समझ सकते हैं कि म्यूटेबल स्ट्रिंग्स का मतलब क्या है कि आप डिक्ट्स में भरोसेमंद नहीं हैं? सूची उत्परिवर्तनीय हैं, लेकिन उन्हें डिक्ट्स में रखा जा सकता है, जो परिवर्तनीय तारों को अविश्वसनीय बना देगा? – wnnmaw

+6

@wnnmaw क्या लार्समैन का मतलब है कि आप स्ट्रिंग्स को स्ट्रिंग्स को कुंजियों के रूप में उपयोग करने में सक्षम नहीं होंगे, क्योंकि एक स्ट्रिंग को संशोधित करना हैश को बदल देगा, जिससे स्ट्रिंग पर जाने वाली बाल्टी बदल जाएगी। आप इसे किसी शब्दकोश के लिए कुंजी के रूप में उपयोग करने का प्रयास करके स्वयं सूची के साथ देख सकते हैं ('a = {}; a [[1,2]] = 1' 'TypeError' फेंकता है)। –

2

अपरिवर्तनीय तार प्रोग्रामिंग को अधिक आसान बनाता है, यही कारण है कि सी # और जावा भी उनका उपयोग करते हैं।

स्ट्रिंग्स व्यवहार्य हो गया था, तो आप किसी बाहरी रूप से प्रदान की गई स्ट्रिंग पर भरोसा नहीं कर पाएंगे, क्योंकि एक दुर्भावनापूर्ण कॉलर इसे नीचे बदल सकता है।
यह बहु-थ्रेडिंग को और भी कठिन बना देगा।

3

अधिकांश भाषाओं में अपरिवर्तनीय तार हैं। इसमें जावा, पायथन और सी # शामिल हैं। आम तौर पर तारों को संयोजित करते समय, भाषा पूरी तरह से नई स्ट्रिंग आवंटित करती है और दो तारों की सामग्री को नई स्ट्रिंग में कॉपी करती है।

अपरिवर्तनीयता प्रोग्रामिंग को आसान बनाता है। विशेष रूप से जब एक बहु थ्रेडेड पर्यावरण से निपटने।

5
  1. अपरिवर्तनीय वस्तुएं स्वचालित रूप से थ्रेडसेफ होती हैं।
  2. आप पाएंगे कि अजगर तार का उपयोग कर आप एक स्ट्रिंग प्राप्त कर लेते हैं सी
5

अपरिवर्तनीय तार बहुत स्मृति आवंटन को आसान बनाने में जब सी तार के साथ तुलना में होगा: आप लंबाई पर लगता नहीं है और पर्याप्त से ज्यादा किया आप उम्मीद कर ओवर-द आवंटित।

वे अधिक सुरक्षित कर रहे हैं: आप कभी नहीं कर सकते हैं एक बफर सी

में जिस तरह से आप कर सकते हैं लंघन है

केवल एक अस्थायी स्ट्रिंग उपयोग है।

  • सबस्ट्रिंग या एक ही चरित्र

सभी अन्य स्ट्रिंग उपयोग के मामलों (संयोजन, खोज, आदि, आदि) अस्थिरता कोई फर्क नहीं पड़ता की जगह। अन्य सभी मामलों में, व्यवहार्यता कोई फर्क नहीं पड़ता।

आप एक चरित्र या अजगर में सबस्ट्रिंग बदलना चाहते हैं, तो आप बस एक नया स्ट्रिंग

x = x[:place] + replacement + x[place+1:] 

केवल कोड है कि उपन्यास या विशिष्ट है कि पैदा करते हैं।


कारणों से मैं समझने में असफल रहा, यह निम्नलिखित जोड़ना महत्वपूर्ण प्रतीत होता है।

"अपरिवर्तनीय तारों से स्ट्रिंग बफर ओवरफ़्लो से बचने के अन्य तरीके हैं।"

इस प्रश्न के प्रयोजनों के लिए (पाइथन के बारे में, विशेष रूप से) अपरिवर्तनीय तारों का कोई बफर ओवरफ़्लो का सुखद परिणाम नहीं होता है। अन्य भाषाओं के लिए, अन्य सिद्धांत, नियम और बारीकियां लागू होती हैं।

+2

रुबी (एक उदाहरण के रूप में) में परिवर्तनीय तार हैं, और इसमें स्वचालित मेमोरी प्रबंधन है और इसमें बफर ओवरफ़्लो नहीं हो सकते हैं। सबस्ट्रिंग्स को एकमात्र उपयोग करने के मामले के रूप में बदलने के लिए, (जगह में) जोड़ना क्या है? -1 – delnan

+0

कोई "जगह में संलग्न" नहीं है। यह सिर्फ संलग्न है। 'x = x + y'। या 'x + = y'। आप यह नहीं बता सकते कि यह जगह में था या अपरिवर्तनीय तारों के साथ किया गया था। –

+0

@ डेलन: रूबी? यह इस सवाल का हिस्सा नहीं है। –

5

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