2014-02-26 84 views
1

我想檢查兩個變量是否引用不同的對象。我知道在python字符串也是對象(我現在是一名Java程序員學習python)。我讀is檢查引用,而==檢查值,但是當我運行下面的代碼時,它似乎檢查值!參考python中的字符串比較

name1 = "ABC D" 
name2 = "ABC D" 

if name1 is name2: 
    print "Equal!!!" 
else: 
    print "NOT equal!!!" 

它給出了等於!

+0

可能字符串文字以不同的方式處理..嘗試使用兩個對象... –

+1

字符串在Python中是不可變的,因此它們可以被重用。 – Matthias

+0

另請參閱有關在python中的字符串池:http://stackoverflow.com/questions/2519580/are-strings-pooled-in-python – pajton

回答

2

正如來自Matthias的評論,name1 = "ABC D"只是將對象「ABC D」的引用分配給name1。

如有疑問,您可以實際檢查通過ID基礎對象(),以檢查是否蟒蛇以同樣的方式,你認爲:)

name1 = "ABC D" 
name2 = "ABC D" 
name3 = "Different string" 
print id(name1) 
print id(name2) 
print id(name3) 
+0

但如何檢查引用兩個字符串的兩個變量是否不同?假設我想讓name1和name2真的不同,但具有相同的字符串值! –

+1

@AlexTwain你爲什麼要這麼做? – thefourtheye

4

Python解釋器將實習生小字符串(其中「小「取決於實現)。這就是爲什麼name1 is name2給出True:這兩個名稱引用同一個字符串對象。

CPython以及其他可能的實現方式並沒有實習運行時表達式的結果,所以如果真的需要你的字符串是不同的對象,你可以動態地構建它們。例如:

In [1]: prefix = 'ABC ' 

In [2]: a = prefix + 'D' 

In [3]: b = prefix + 'D' 

In [4]: a is b 
Out[4]: False 

在另一方面,如果你只是嘗試,看看會發生什麼,但你關心已經琴絃來自運行時表達式,你應該不需要做什麼特別的。

我會說,無論如何,該字符串interning是一個實現細節。根據您的使用情況,如果確實需要確保您的對象始終具有不同的身份,則應該使用自定義類。例如:

class Marker(str): 
    __slots__ =() 

這可能會按預期工作:

In [6]: Marker('ABC D') 
Out[6]: 'ABC D' 

In [7]: Marker('ABC D') is Marker('ABC D') 
Out[7]: False 

In [8]: Marker('ABC D') == Marker('ABC D') 
Out[8]: True 

,除非你打算使用你的對象作爲字典鍵和你預期不同的對象是不同的密鑰。但是,在這種情況下,普通字符串也不起作用。