2013-07-16 53 views
10

在Java中,顯式聲明的字符串是由JVM實現的,因此相同字符串的後續聲明會生成兩個指向同一個String實例的指針,而不是兩個單獨(但相同)的字符串。Python實習生字符串?

例如:

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(或任何其他的Python運行時)做串同樣的事情?例如,如果我有一些類:

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

而創建該類的10個實例,將它們中的每一個具有一個實例變量參照在存儲器中的相同的字符串,或我將結束與10名單獨的字符串?

+3

這就是所謂的實習,是的,Python對此做了一些擴展,對於以字符串文字形式創建的較短的字符串。請參見[Python string interning](http://stackoverflow.com/q/15541404) –

+0

[Python'=='vs'可能重複的是'比較字符串','有時會失敗,爲什麼?](http:// stackoverflow.com/questions/1504717/python-vs-is-comparing-strings-is-fails-sometimes-why) – OptimusCrime

+0

@MartijnPieters - 謝謝,但「短」字符串有多短?這是依賴於運行時,還是有一個標準? – csvan

回答

11

這被稱爲實習,是的,Python在一定程度上做到了這一點,對於以字符串文字形式創建的更短的字符串。有關討論,請參閱About the changing id of a Python immutable string

實習是依賴於運行時間,它沒有標準。在內存使用和檢查你是否創建相同字符串的成本之間,實習往往是一種折衷。有一個built-in intern() function給力的問題,如果你願意的話,其中記錄的實習Python做自動爲您一些

通常情況下,在Python程序中使用的名稱被自動拘留,以及所使用的字典保存模塊,類或實例屬性都有實際的密鑰。

請注意,Python 3將intern()函數移動到sys module

+0

請注意,intern內置似乎已在Python 3中刪除。我不覺得就像現在正在挖掘哪個版本。 – zwol

+0

@zwol:3.0。我會看看我能否找到動機,可能在某個地方的PEP中。 –

+0

@zwol:它被移到了「sys」模塊。 –

3

一個很簡單的方法是使用id()。不過@MartijnPieters提到,這是依賴於運行時間的。

class example(): 

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

for i in xrange(10): 
    print id(example()._inst)