В чем разница между?

#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