Почему «if (x)» отличается от «if (x == True)» в Python? - PullRequest
0 голосов
/ 19 декабря 2018

Извините, если об этом раньше не спрашивали, потому что это очевидно для любого, кто имеет какую-либо форму обучения на Python.Я провел большую часть своих дней, программируя на Java, и мне было интересно, как это сделать, я считаю, что это идиосинкразия в Python.Я возился с

this=bool
if(this==True):this="big"
print(this)

Неудивительно, что я получил объявление универсального типа в качестве вывода, потому что оно действительно будет большим, если True.

<class 'bool'>

Затем я использовал свое ограниченное понимание JavaЧтобы определить, что я мог бы упростить выражение больше, это условно, верно?Они сделаны для булевых типов.

this=bool
if(this):this="big"
print(this)

Тогда я чуть не рассмеялся вслух, но это было наполнено ужасом

big

Имеет смысл, что "это" "менее ложно"чем «this == True», что ложно с большой буквы F, но я все еще не думал, что это следует оценивать как True.Кроме того, правдивость и ложь в других случаях кажутся достаточно хорошими, чтобы дать ожидаемый результат.Так что же делает пустую логическую истину правдой?

Моя первая мысль была о том, что нужно просто проверить, существует ли «это».Поэтому я удалил объявление в первой строке, ожидая, что «if ([что-то, что не существует]):» будет пропущено.Вместо этого он выбросил ошибку.Если простой факт его существования оценивается как Истина, не должно ли его небытие просто оцениваться как Ложь?В чем смысл функциональности, в которой инициализированное (пустое) значение оценивается как true, если неинициализированное значение не возвращает false?Я думал, что понял после прочтения этого ответа , и действительно, моей первой мыслью было: «О, это просто проверка того, существует ли вообще« это »».Затем я набрал if(this is not None):, а также if(this!=None): и снова получил «большой» в качестве результата, предполагая, что «this» равно Нет.

Затем, почти в приступе паникиЯ набрал

this=bool
if(this==None):this="big"
if(this==True):this="big"
if(this==False):this="big"
print(this)

и, как вы уже догадались, потерпел неудачу

<class 'bool'>

Конечно, логическое значение должно быть одним из этих «трех»?Пожалуйста, не говорите мне, что я обнаружил «четвертое» логическое значение, я не смог справиться с такой дурной славой.

Проблема (я думаю) у меня со всем этим заключается в том, что удаление инициализации«this» в первой строке вызывает ошибку, а не ложный регистр в операторе if.Если «if (x):» выполняется, когда x существует, то не должен ли несуществующий «x» пройти и просто пропустить этот оператор?Почему бы не оставить логическое значение, если функциональность Java, и просто заставить нас проверить, не является ли x в этом случае нулевым?

Ответы [ 4 ]

0 голосов
/ 19 декабря 2018

Проще говоря, вы не можете сказать, что if x имеет то же значение, что и if x == True в Python.Их результат зависит от того, как определены методы x __bool__ и __eq__ соответственно.

Для самих классов, таких как bool или int (то есть тип, а не объектэтот класс), __bool__ определен, чтобы всегда возвращать True;в то время как сравнение с True возвращает False.

Следовательно:

if int == True: print("NOT printed")
if int: print("printed")
if bool(int): print("printed") # equivalent to the previous one
0 голосов
/ 19 декабря 2018

Я не понимаю, что ты здесь делаешь.Вы берете class bool и проверяете, точно ли он равен True.Ну, нет, конечно, это не так, True является экземпляром bool, класс не совсем равен его экземплярам.Это не равно False или None либо.Но это не мешает ему быть истинным в булевом контексте, потому что он не пустой.

0 голосов
/ 19 декабря 2018

bool - встроенный класс.Вы присваиваете this классу bool, чтобы оно никогда не равнялось True.Когда вы набираете if(this), this автоматически преобразуется в логическое значение, чтобы его можно было оценить в операторе if.Классы всегда конвертируются в True, а не False, поэтому выполняется оператор if.

0 голосов
/ 19 декабря 2018

bool это не логическое значение, это класс (как int, str и т. Д.).Классы всегда правдивы.

Я думаю, что вы хотели написать this = bool() (то же самое, что и this = False - нет такого понятия, как "пустой" логический тип).

...