2016-12-15 3 views
0

при попытке устранить несколько строк в списке строк, я пытался использовать простой код, подобный:питон строка (с пространством) соответствие

>>> 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 - это тест на личность; когда он работает с строками, это связано с интернированием строк или небольшим строковым кешем; это детали реализации, на которые никогда не следует полагаться.

Не используйте is/is not в целом, за исключением сравнений с None, пока вы не поймете, что он делает. Вы хотите, чтобы != здесь tests value (оба объекта представляют одну и ту же логическую информацию?), А не is not, которые tests identity (обе вещи относятся к одному и тому же объекту?).

Если вы хотите заставить это работать, вы можете сделать что-то страшное, как явно, все связанные с ним строки, но это не спасает никакой работы (работа проводится с их интернированием), и на нее обычно нахмуривают ,