#python #string #eval
#python #строка #eval
Вопрос:
string1 = "15 > 4 "
string2 = "'15' > '4'"
print(eval(string1))
print(eval(string2))
True
False
Как и сказано в названии. Почему у вас разные значения для одной и той же строки?
Комментарии:
1. потому что
'1' < '4'
2. и
'1111111111111' > '2'
этоFalse
называется лексикографическим сравнением — в отличие от сравнения числовых.3. Как вы думаете, почему это одна и та же строка? Есть ли
"15 > 4"
'
в нем символы? Есть ли"'15' > '4'"
'
в нем символы? Разве это не отличается?
Ответ №1:
Нет, это разные, потому что первый сравнивает два целых числа, а второй сравнивает со строками.
Сравнение строк Python выполняется с использованием символов в обеих строках. Символы в обеих строках сравниваются один за другим. Когда найдены разные символы, сравнивается их значение в Юникоде. Символ с меньшим значением Unicode считается меньшим.
и здесь ord('1')
49 и ord('4')
52, так 49 < 52
что я имею '1' < '4'
в виду, что так оно и есть False
.
Комментарии:
1. Спасибо за включение аспекта Unicode. Сильный ответ.
Ответ №2:
В первом случае вы сравниваете целые числа. Во втором случае вы сравниваете строки.
Поскольку строки сравниваются посимвольно, а 4 больше 1, оператор '15' > '4'
вычисляется False
как .
Ответ №3:
Со строкой 1 eval() будет обрабатывать comparisaon как сравнение двух целых чисел, тогда как со строкой 2 он будет обрабатывать его так, как если бы он сравнивал две строки.
15> 4 (целых чисел) = True
’15’> ‘4’ (строки) = False
При сравнении строки «15» со строкой «4» строки будут сравниваться посимвольно, и поэтому 15 считается меньшим, потому что строка начинается с «1», что меньше, чем «4» при преобразовании в их значения в Юникоде.
Если бы вы должны были сделать что-то вроде этого :
string1 = "55 > 4 "
string2 = "'55' > '4'"
print(eval(string1))
print(eval(string2))
Вывод будет :
True
True