一個簡單的問題通常有一個簡單的答案,但我正在努力尋找它。有人可以解釋爲什麼以下不匹配?Python字符串比較不匹配正斜槓
string = 'HTTP/NONE'
if string is 'HTTP/NONE': print 'match'
一個簡單的問題通常有一個簡單的答案,但我正在努力尋找它。有人可以解釋爲什麼以下不匹配?Python字符串比較不匹配正斜槓
string = 'HTTP/NONE'
if string is 'HTTP/NONE': print 'match'
您正在測試身份,而不是平等。改爲使用==
。
你在混淆身份與平等。兩張1美元的鈔票具有相同的價值,所以在購買甜甜圈時它們是平等的。但他們每個人都有一個單獨的身份。
爲了提高性能,當您告訴Python存儲相同的文字值時,Python有時會使用相同的對象。這被稱爲內部,當發生這種情況時,您會得到一個int
或str
值的參考,只是發生也是同一個對象。
is
測試身份;它基本上實現爲id(a) == id(b)
,如果它們的值的標識相等,則兩個參考是相同的。所指的是相同的物體,而不僅僅是相同的值。
改爲使用==
。也要注意不要將變量命名爲與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
經驗法則:如果你不能解釋「是」是什麼,不要使用它。 – Matthias 2013-04-11 10:47:05
is
測試身份。從Python Documentation:
運營商
is
和is 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緩存int
,float
,小弦。這是通過調用函數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
正如你所看到的,在這種情況下,即使它們是由不同的分配操作創建,既s1
和s2
是同一個對象。
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
祝你好運!
使用::
string = 'HTTP/NONE'
if string == 'HTTP/NONE':
print 'Match!'
else:
print 'No Match!'
爲我工作。顯然,字符串像==
現在刪除分號! :) – jamylak 2013-04-11 09:52:23
你誤解了'是'*是什麼意思*。 'int's'like''=='。測試相等性與測試身份是非常不同的操作。兩張1美元紙幣具有相同的*值*,但它們仍然是兩張單獨的紙張。他們是平等的,但有不同的身份。 – 2013-04-11 09:54:11
@jamylak:對不起'布特分號,來自C背景XD – 2013-04-12 06:27:49
string = 'HTTP/NONE'
if string == 'HTTP/NONE': print 'match'
它會工作。
改爲使用'=='。 – 2013-04-11 09:47:04
[Python'=='vs'可能重複'比較字符串','有時會失敗,爲什麼?](http://stackoverflow.com/questions/1504717/python-vs-is-comparing-strings-is -fails-sometimes-why) – 2013-04-11 09:52:26