2013-07-16 13 views
10

जावा में, स्पष्ट रूप से घोषित स्ट्रिंग्स को जेवीएम द्वारा प्रशिक्षित किया जाता है, ताकि उसी स्ट्रिंग के बाद की घोषणा दो अलग-अलग (लेकिन समान) स्ट्रिंग्स के बजाए एक ही स्ट्रिंग इंस्टेंस के दो बिंदुओं में हो।क्या पाइथन इंटर्न स्ट्रिंग करता है?

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

public String baz() { 
    String a = "astring"; 
    return a; 
} 

public String bar() { 
    String b = "astring" 
    return b; 
} 

public void main() { 
    String a = baz() 
    String b = bar() 
    assert(a == b) // passes 
} 

मेरा प्रश्न है, CPython (या किसी अन्य अजगर क्रम) तार के लिए एक ही बात करता है? उदाहरण के लिए, अगर मैं कुछ वर्ग है:

class example(): 
    def __init__(): 
     self._inst = 'instance' 

और इस वर्ग के 10 उदाहरण बना, उनमें से हर एक एक उदाहरण चर स्मृति में एक ही स्ट्रिंग की चर्चा करते हुए होगा, या मैं 10 अलग तार के साथ खत्म हो जाएगा ?

+3

इसे इंटर्निंग कहा जाता है, और हां, पायथन स्ट्रिंग अक्षर के रूप में बनाए गए छोटे तारों के लिए कुछ विस्तार करने के लिए ऐसा करता है। [पायथन स्ट्रिंग इंटर्निंग] देखें [http://stackoverflow.com/q/15541404) –

+0

[पाइथन '==' बनाम 'की संभावित डुप्लिकेट' स्ट्रिंग की तुलना 'है,' कभी-कभी विफल हो जाती है, क्यों?] (Http: // stackoverflow.com/questions/1504717/python-vs-is-comparing-strings-is-fails- कभी-कभी- क्यों) – OptimusCrime

+0

@MartijnPieters - धन्यवाद, लेकिन "छोटे" तार कितने छोटे हैं? क्या यह रनटाइम निर्भर है, या इसके लिए कोई मानक है? – csvan

उत्तर

11

इसे इंटर्निंग कहा जाता है, और हां, पायथन कुछ हद तक ऐसा करता है, स्ट्रिंग अक्षर के रूप में बनाए गए छोटे तारों के लिए। कुछ चर्चाओं के लिए About the changing id of a Python immutable string देखें।

आंतरिक रनटाइम निर्भर है, इसके लिए कोई मानक नहीं है। आंतरिक उपयोग हमेशा स्मृति उपयोग के बीच एक व्यापार-बंद होता है और यदि आप एक ही स्ट्रिंग बना रहे हैं तो जांच की लागत। वहाँ अगर तुम जो कुछ होना शामिल अजगर आप के लिए स्वचालित रूप से करता है की दस्तावेजों इसलिए इच्छुक हैं, एक built-in intern() function मुद्दा मजबूर करने के लिए है:

आम तौर पर, अजगर कार्यक्रमों में उपयोग होने वाले नाम स्वचालित रूप से प्रशिक्षु रहे हैं, और शब्दकोशों इस्तेमाल किया मॉड्यूल, कक्षा या आवृत्ति गुणों को पकड़ने के लिए कुंजी को प्रशिक्षित किया गया है।

ध्यान दें कि अजगर 3 sys module को intern() समारोह ले जाया गया।

+0

ध्यान दें कि 'इंटर्न' अंतर्निहित पाइथन 3 में हटा दिया गया प्रतीत होता है। मुझे नहीं लगता बिल्कुल सही संस्करण को खोदने की तरह। – zwol

+0

@zwol: 3.0। मैं देखूंगा कि मुझे प्रेरणा मिल सकती है, शायद कहीं पीईपी में। –

+0

@zwol: इसे 'sys' मॉड्यूल में ले जाया गया था। –

3

id() का उपयोग करके बताने का एक आसान तरीका है। हालांकि @MartijnPieters का उल्लेख है, यह रनटाइम निर्भर है।

class example(): 

    def __init__(self): 
     self._inst = 'instance' 

for i in xrange(10): 
    print id(example()._inst) 
संबंधित मुद्दे