2013-04-11 88 views
1

一個簡單的問題通常有一個簡單的答案,但我正在努力尋找它。有人可以解釋爲什麼以下不匹配?Python字符串比較不匹配正斜槓

string = 'HTTP/NONE' 
if string is 'HTTP/NONE': print 'match' 
+0

改爲使用'=='。 – 2013-04-11 09:47:04

+1

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

回答

1

您正在測試身份,而不是平等。改爲使用==

你在混淆身份與平等。兩張1美元的鈔票具有相同的價值,所以在購買甜甜圈時它們是平等的。但他們每個人都有一個單獨的身份。

爲了提高性能,當您告訴Python存儲相同的文字值時,Python有時會使用相同的對象。這被稱爲內部,當發生這種情況時,您會得到一個intstr值的參考,只是發生也是同一個對象。

is測試身份;它基本上實現爲id(a) == id(b),如果它們的值的標識相等,則兩個參考是相同的。所指的是相同的物體,而不僅僅是相同的

2

改爲使用==。也要注意不要將變量命名爲與python模塊相同的名稱。

>>> mystr = 'HTTP/NONE' 
>>> mystr is 'HTTP/NONE' 
False 
>>> mystr == 'HTTP/NONE' 
True 

is操作試驗身份 - 只有返回True對於具有相同id對象。 ==只檢查兩個對象是否具有相同的值,這就是您想要的。如果我們查看mystr'HTTP/NONE'id s,我們可以看到它們是不同的。

>>> id(mystr) 
64342000 
>>> id('HTTP/NONE') 
64341360 
+0

經驗法則:如果你不能解釋「是」是什麼,不要使用它。 – Matthias 2013-04-11 10:47:05

2

is測試身份。從Python Documentation

運營商isis not測試對象標識:當且僅當x和y是相同的對象x is y是真實的。 x is not y產生逆真值。

在處理比較值時,您最好使用==。例如IPython的會議:

In [1]: s = 'A/B' 

In [2]: s == 'A/B' 
Out[2]: True 

In [3]: s is 'A/B' 
Out[3]: False 

In [4]: b = 'A/B' 

In [5]: s is b 
Out[5]: False 

In [6]: b == s 
Out[6]: True 

鑑於操作員的身份檢查比較對象的ID,它的結果有怪癖因爲Python緩存intfloat,小弦。這是通過調用函數id()可見:

In [28]: s1, s2 = 'Joe', 'Joe' 

In [29]: id(s1), id(s2) 
Out[29]: (21399760, 21399760) 

In [30]: s1 is s2 
Out[30]: True 

正如你所看到的,在這種情況下,即使它們是由不同的分配操作創建,既s1s2同一個對象

Here「SA類似的案件與詮釋對象,來自Python文檔相關this解釋:

當前實現保持整數對象爲-5和256之間的所有整數數組,當你創建一個int在那個範圍內,你實際上只是返回對現有對象的引用。

我沒有找到字符串類型的解釋,但我認爲這是相同的,因此is不應該用於值比較。它有時會返回False有時True

In [39]: s = 'Joe' 

In [40]: id('Joe') 
Out[40]: 21403136 

In [41]: id(s) 
Out[41]: 21403136 

In [42]: s is 'Joe' 
Out[42]: True 

祝你好運!

3

使用::

string = 'HTTP/NONE' 
if string == 'HTTP/NONE': 
    print 'Match!' 
else: 
    print 'No Match!' 

爲我工作。顯然,字符串像==

+0

現在刪除分號! :) – jamylak 2013-04-11 09:52:23

+2

你誤解了'是'*是什麼意思*。 'int's'like''=='。測試相等性與測試身份是非常不同的操作。兩張1美元紙幣具有相同的*值*,但它們仍然是兩張單獨的紙張。他們是平等的,但有不同的身份。 – 2013-04-11 09:54:11

+0

@jamylak:對不起'布特分號,來自C背景XD – 2013-04-12 06:27:49

0
string = 'HTTP/NONE' 
if string == 'HTTP/NONE': print 'match' 

它會工作。