В чем разница между ключевым словом: есть и == в питоне - PullRequest
3 голосов
/ 16 марта 2012

ключевое слово python is предполагается использовать вместо оператора == в соответствии с руководствами по стилю python.

Однако они не всегда делают то же самое, что показано здесь. Зачем? Какова реальная разница и как правильно ее использовать?

import unittest

class testIS(unittest.TestCase):
    def test_is(self):
        self.assertEqual(1,1)

if __name__ == '__main__':
    unittest.main()

Что работает ... но не работает ...

import unittest

class testIS(unittest.TestCase):
    def test_is(self):
        self.assertEqual(1,1)

if __name__ is '__main__':
    unittest.main()

Ответы [ 6 ]

7 голосов
/ 16 марта 2012

== тесты на равенство.Два неидентичных объекта могут быть равны.

is проверяет идентичность, то есть ссылаются ли оба на один и тот же объект.

5 голосов
/ 16 марта 2012

is вернет True, если две переменные указывают на один и тот же объект, == если объекты, на которые ссылаются переменные, равны.

2 голосов
/ 16 марта 2012
if money_in_wallet is money_that_was_in_wallet(two_weeks_ago):
    print("I still live with my parents and have no income or expenses")
elif money_in_wallet == money_that_was_in_wallet(two_weeks_ago):
    print("Good, my budget is exactly balanced")
0 голосов
/ 16 марта 2012

- это тесты, если оба входа на самом деле являются одним и тем же объектом.Это находится тот же адрес в памяти.

== вызывает метод __ eq __ для одного из входных объектов.Затем объекты могут определить свой собственный метод __ eq __ и решить, что равно, а что нет.

0 голосов
/ 16 марта 2012

Ключевое слово Python 'is' проверяет идентичность объекта, а оператор == проверяет равенство значений. Например:

>>> if Car1 is Car2:
>>>     [do something...]

этот код проверяет, относятся ли Car1 и Car2 к одной и той же машине, а

>>> if Car1 == Car2:
>>>     [do something...]

проверяет, имеют ли Car1 и Car2 одинаковое качество, то есть имеют ли они одинаковую модель, цвет и т. Д.

По этой причине __name__ is "__main__" возвращает False, поскольку строка "__main__" и значение, сохраненное в __name__, на самом деле являются двумя разными строковыми объектами. Чтобы проверить, равно ли значение строки __name__ строке __main__, используйте оператор ==.

0 голосов
/ 16 марта 2012

Проверить ...

http://docs.python.org/reference/expressions.html#not-in

... Какие состояния ...

Операторы is и is not проверяют идентичность объекта: x - это y истинно тогда и только тогда, когда x и y - один и тот же объект

...