2016-12-15 114 views
0

,而試圖消除字符串列表弦數,我試圖用類似於一個簡單的代碼:Python字符串(含空格)匹配

>>> s = ['a b', 'c d', 'e f', 'g h'] 
>>> for i in s: 
...  if i is not 'e f': 
...   print(i) 
... 
a b 
c d 
e f # this should not get printed, right? 
g h 

,我無法瞭解底層的行爲? 你能解釋一下嗎?因爲以下看起來合乎邏輯並且上面也應該相應地起作用

>>> if 'a b' is not 'a b': 
...  True 
... else: 
...  False 
... 
False 
>>> s = ['a', 'c', 'e', 'g'] 
>>> for i in s: 
...  if i is not 'e': 
...   print(i) 
... 
a 
c 
g 

是需要特別處理的空間嗎?我錯過了什麼?

回答

3

is not是基於身份的測試;當它在字符串上工作時,這是由於字符串的實習或小字符串緩存;這是一個永遠不應該依賴的實現細節。

除非與None比較,否則一般情況下不要使用is/is not,除非您真的明白它在做什麼。你想!=在這裏,其中tests value(做兩個對象代表相同的邏輯信息?),而不是is not,其中tests identity(都指的是完全相同的對象?)。

如果你想強制這個工作,你可以做一些可怕的事情,比如明確地涉及所有的字符串,但這並不能節省任何工作(工作花在實習它們上面),而且它通常是不被接受的。