在尝试消除字符串列表中的少数字符串时,我尝试使用类似于:
的简单代码>>> 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
是要特别对待的空间吗?我错过了什么?
答案 0 :(得分:3)
is not
是基于身份的测试;当它在字符串上工作时,它是由于字符串的内部或小字符串缓存;这是一个永远不应该依赖的实现细节。
除了与is
的比较之外,一般不要使用is not
/ None
,除非您真正理解它在做什么。你想在这里!=
,tests value(这两个对象代表相同的逻辑信息吗?),而不是is not
,tests identity(两者都指的是完全相同的对象?)。
如果你想迫使它发挥作用,你可以做一些可怕的事情,比如明确地intern
所涉及的所有字符串,但这不会保存任何工作(工作花费在他们身上),而且它是一般不赞成。