Python: Разница между! = И "нет" - PullRequest
9 голосов
/ 25 апреля 2011

Мне неясна разница между синтаксисом != и is not. Похоже, они делают то же самое:

>>> s = 'a'
>>> s != 'a'
False
>>> s is not 'a'
False

Но, когда я использую is not в понимании списка, это дает другой результат, чем если бы я использовал !=.

>>> s = "hello"
>>> [c for c in s if c is not 'o']
['h', 'e', 'l', 'l', 'o']
>>> [c for c in s if c != 'o']
['h', 'e', 'l', 'l']

Почему o был включен в первый список, но не во второй список?

Ответы [ 5 ]

32 голосов
/ 25 апреля 2011

is проверяет идентичность объекта, но == проверяет равенство значений объекта:

In [1]: a = 3424
In [2]: b = 3424

In [3]: a is b
Out[3]: False

In [4]: a == b
Out[4]: True
8 голосов
/ 25 апреля 2011

is not сравнивает ссылки.== сравнивает значения

1 голос
/ 25 апреля 2011

В зависимости от того, как вы запутались, это может помочь.

Эти утверждения совпадают:

[c for c in s if c != 'o']
[c for c in s if not c == 'o']
0 голосов
/ 30 июня 2016

Я хотел бы добавить, что они определенно не делают то же самое.Я бы использовал!Например, если у вас есть строка в кодировке Unicode ....

a = u'hello'
'hello' is not a
True
'hello' != a
False

С помощью! =, Python в основном выполняет неявное преобразование из str () в unicode () и сравнивает их, тогда как с "нет" это соответствуетесли это точно такой же экземпляр.

0 голосов
/ 25 мая 2015

Я просто цитирую по ссылке, is проверяет, являются ли операнды одним и тем же, возможно, ссылаясь на один и тот же объект. где != проверяет значение.

s = [1,2,3]
while s is not []:
   s.pop(0);

это неопределенный цикл, поскольку объект s никогда не равен ссылке на объект по [], он ссылается на совершенно другой объект. где замена условия на s != [] сделает цикл определенным, потому что здесь мы сравниваем значения, когда все значения в s всплывают, и остается пустой список.

...