2016-12-15 137 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(都指的是完全相同的对象?)。

如果你想强制这个工作,你可以做一些可怕的事情,比如明确地涉及所有的字符串,但这并不能节省任何工作(工作花在实习它们上面),而且它通常是不被接受的。