Python Разница между not и !=

Мне было интересно, в чем разница между этими двумя фрагментами кода:

while choice != "y" and choice != "n":
while not choice == "y" and not choice == "n":

person GiamPy    schedule 20.05.2013    source источник
comment
Один легче напечатать. Я бы предположил, что это также более эффективно.   -  person Volatility    schedule 20.05.2013
comment
@Volatility Более эффективно читать людям, да. Любая разница в производительности либо неизмерима, либо, по крайней мере, незначительна ;-)   -  person    schedule 20.05.2013
comment
Ну, видимо, когда я попробовал, это дало мне совершенно другой результат. С первым вариантом. Если бы я написал что-то другое между Y и N, код запустился бы, а со вторым вариантом - нет - по какой-то причине.   -  person GiamPy    schedule 20.05.2013
comment
stackoverflow.com/questions/9798407/   -  person fcm    schedule 20.05.2013
comment
В дополнение к отличному ответу poke, not также имеет особое значение в некоторых контекстах — например, is not — это оператор. (не два оператора, один оператор). Как и not in.   -  person kampu    schedule 20.05.2013
comment
Это означает, что while choice != "y" and choice != "n" совпадает с while choice is not "y" and choice is not "n" - @кампу?   -  person GiamPy    schedule 20.05.2013
comment
@GiamPy Нет, is и is not — это сравнения идентичности, а == и != — сравнения равенства. Они не обязаны давать одинаковый результат и определенно не работают для строк. Например, 'a{}'.format('b') is 'ab' — ложь, а 'a{}'.format('b') == 'ab' — истина.   -  person poke    schedule 20.05.2013
comment
@GiamPy Нет. is not - это другой оператор, чем !=. (и is — это другой оператор, чем ==). Обычно вы можете думать, что == и != проверяют содержимое объектов, тогда как is и is not буквально проверяют, являются ли операнды одним и тем же объектом. Обычно это полезно для сравнения с единичными значениями, такими как None, True и False. Например, 0 is False оценивается как False, а 0 == False оценивается как True (поскольку целочисленное значение False равно 0).   -  person kampu    schedule 20.05.2013
comment
choice not in ['t', 'f'] в любом случае, вероятно, лучший способ написать это.   -  person Wooble    schedule 20.05.2013
comment
Вы также можете написать while choice == "y" or choice == "n" или while choice not in ("y", "n")   -  person warvariuc    schedule 20.05.2013


Ответы (1)


В первом используется метод объекта __ne__, а во втором — метод объекта __eq__ и отрицает его результат.

Хотя оба метода должны связывать свои результаты, поэтому a == b подразумевает not a != b, на самом деле это не требуется и не применяется.

Между операторами сравнения нет подразумеваемых отношений. Истинность x==y не означает, что x!=y ложно. Соответственно, при определении __eq__() следует также определить __ne__(), чтобы операторы вели себя так, как ожидается.

В вашем случае, где choice - это строка (наверное?), это не имеет большого значения. Все встроенные типы обеспечивают обратную связь между == и !=. Таким образом, единственная разница заключается в том, насколько это понятно при взгляде на код. И лично я предпочитаю более сжатую первую версию.

person poke    schedule 20.05.2013