2013-07-16 34 views
10

Java'da, açıkça bildirilen Dizeler, JVM tarafından içe aktarılır, böylece aynı String'in sonraki bildirimleri, iki ayrı (ancak özdeş) Dizgeden ziyade, aynı Dize örneğine iki gösterici ile sonuçlanır. ÖrneğinPython intern dizeleri var mı?

: CPython (veya başka bir Python çalışma zamanı) dizeleri için aynı şeyi yapar edilir

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 
} 

sorum? Bazı sınıf varsa Örneğin,: Bu sınıfın 10 örneklerini oluşturmak

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

Ve bunların her biri bellekte aynı dizeye atıfta bir örnek değişkeni sahip olacak, yoksa 10 ayrı dizeleri ile sona erecek ?

+3

Buna interning denir, ve evet, Python bunu string extral'leri olarak oluşturulan daha kısa dizeler için bazılarına uzatır. [Python string interning] (http://stackoverflow.com/q/15541404) –

+0

[Python '==' ve 'is' dizelerini karşılaştırabilmenin olası bir kopyası, 'bazen' başarısız oluyor, neden oluyor?] (Http: // stackoverflow.com/questions/1504717/python-vs-is-comparing-strings-is-fails-sometimes-why) – OptimusCrime

+0

@MartijnPieters - teşekkürler, ama sadece "kısa" dizeleri ne kadar kısa? Bu çalışma zamanı bağımlı mı, yoksa bunun için bir standart var mı? – csvan

cevap

11

Buna interning denir, ve evet, Python bunu, string literalleri olarak oluşturulan daha kısa dizeler için bir dereceye kadar yapar. Bazı tartışmalar için bkz. About the changing id of a Python immutable string.

Dahili çalışma zamanı bağımlı, bunun için bir standart yok. Interning, her zaman, bellek kullanımı ile aynı dizgiyi oluşturup oluşturmadığınızı kontrol etme maliyeti arasındaki farktır. Orada Python sizin için otomatik olarak yapar staj ait bazı belgeleyen hangi çok eğimli bir built-in intern() function sorunu zorlamak:

Normalde, Python programlarında kullanılan adları otomatik enterne edilir ve sözlükleri kullanılır modül tutmak için, sınıf veya örnek özniteliklere sahip anahtarlar var. Python 3 sys module için intern() fonksiyonu hareket

not edin.

+0

Not: 'ınternet' yerleşik-Python 3'te kaldırılmış gibi görünüyor. Şu anda tam olarak hangi versiyonu kazmak gibi. – zwol

+0

@zwol: 3.0. Muhtemelen bir yerde bir PEP'de motivasyonu bulabilir miyim göreceğim. –

+0

@zwol: 'sys' modülüne taşındı. –

3

Anlatmanın oldukça kolay bir yolu id(). Ancak, @MartijnPieters'ın bahsettiği gibi, bu çalışma zamanı bağımlıdır.