Есть ли логическая разница между 'not ==' и '! = (Без is) - PullRequest
5 голосов
/ 21 марта 2012

Есть ли существенная разница в Python 3.x между:

for each_line in data_file:
    if each_line.find(":") != -1:
        #placeholder for code
        #more placeholder

и

for each_line in data:
    if not each_line.find(":") == -1:
        #placeholder for code
        #more placeholder

Мой вопрос не относится к вышеупомянутому использованию, но является более общим или существенным - это синтаксическое различие работает по-другому, даже если результат тот же? Есть ли логическая разница? Существуют ли задачи, в которых кто-то более уместен, или это исключительно стилистическая разница? Если это просто стилистика, какой из них считается более чистым программистами Python?

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

Ответы [ 3 ]

6 голосов
/ 21 марта 2012

Как я понимаю, функционально они не совсем одинаковы; если вы сравниваете с классом, класс может иметь функцию-член __ne__, которая вызывается при использовании оператора сравнения! =, в отличие от __eq__, который вызывается при использовании сравнения ==

Итак, в данном случае,
not (a == b) вызовет __eq__ для a, с b в качестве аргумента, затем not результат
(a != b) вызовет __ne__ для a с аргументом b.

Я бы использовал первый метод (используя! =) Для сравнения

4 голосов
/ 21 марта 2012

Различные богатые сравнения методы вызываются в зависимости от того, используете ли вы == или !=.

class EqTest(object):
    def __eq__(self, other):
        print "eq"
        return True
    def __ne__(self, other):
        print "ne"
        return False

a = EqTest()
b = EqTest()

print not (a == b)
# eq
# False
print a != b
# ne
# False

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

Я бы использовал != вместо not и == просто потому, что это одна операция вместо двух.

1 голос
/ 21 марта 2012

Ваш первый пример - как вы должны тестировать результат find.

Ваш второй пример слишком много делает. Он дополнительно выполняет логическое not в результате выражения each_line.find(":") == -1.

В этом контексте вы хотите использовать not, когда у вас есть что-то, что вы можете проверить на правдивость или ложность.
Например, пустая строка '' оценивается как False:

s = ''
if not s:
    print('s is the empty string')

Похоже, вы немного смешиваете выражения проверки личности is и is not с логическим значением not.

Пример того, как вы выполняете проверку личности:

result_of_comparison = each_line.find(":") == -1
if result_of_comparison is False: # alternatively: is not True
    pass
...