Чому (1 в [1,0] == Істинно) визначається помилковим?


153

Переглядаючи відповіді на це питання , я виявив, що не розумію власної відповіді.

Я не дуже розумію, як це розбирають. Чому другий приклад повертає помилкове?

>>> 1 in [1,0]             # This is expected
True
>>> 1 in [1,0] == True     # This is strange
False
>>> (1 in [1,0]) == True   # This is what I wanted it to be
True
>>> 1 in ([1,0] == True)   # But it's not just a precedence issue!
                           # It did not raise an exception on the second example.

Traceback (most recent call last):
  File "<pyshell#4>", line 1, in <module>
    1 in ([1,0] == True)
TypeError: argument of type 'bool' is not iterable

Дякуємо за будь-яку допомогу. Я думаю, що я повинен пропустити щось дійсно очевидне.


Я думаю, що це тонко відрізняється від зв'язаного дубліката:

Чому вираз 0 <0 == 0 повертає Хибність у Python? .

Обидва питання стосуються людського розуміння цього виразу. Здавалося, існує два способи (на мій погляд) оцінки виразу. Звичайно, вони не були правильними, але на моєму прикладі остання інтерпретація неможлива.

Дивлячись, 0 < 0 == 0ви могли б уявити, як кожну половину оцінюють і має сенс як вираз:

>>> (0 < 0) == 0
True
>>> 0 < (0 == 0)
True

Отже, посилання відповідає на те, чому це оцінює False:

>>> 0 < 0 == 0
False

Але з мого прикладу 1 in ([1,0] == True)немає сенсу як вираження, тому замість того, щоб існувати дві (правда, неправильні) можливі інтерпретації, здається можливим лише одне:

>>> (1 in [1,0]) == True

1
Операторський пріоритет ... ==зв'язується жорсткіше in, тому [1,0] == Trueспочатку оцінюється, а потім отримує результат 1 in other_result.
Марк Б

Я видалив тег Python-2.7, оскільки Python 3.2 поводиться так само.
lvc

1
@Marc B: Не пояснює другого виразу
Скотт Хантер

32
@MarcB, питання включало тест з використанням дужок, щоб спростувати цю інтерпретацію.
Марк Викуп

Відповіді:


194

Python насправді застосовує тут ланцюжок операторів порівняння. Вираз перекладається на

(1 in [1, 0]) and ([1, 0] == True)

що очевидно False.

Це також відбувається для таких виразів

a < b < c

які перекладають на

(a < b) and (b < c)

(без оцінки bдвічі).

Детальнішу інформацію див. У документації з мови Python .


40
Додатковий доказ цього, 1 in [1, 0] == [1, 0]оцінює до True.
Ендрю Кларк

9
Я давно вважав це як мовну бородавку. Я вважав за краще, щоб inоператор мав вищий пріоритет, ніж інші оператори порівняння, і щоб він не був ланцюжком. Але, можливо, я пропускаю випадок використання.
Стівен Румбальський

3
приємний улов, я навіть не думав про це. Немає особливого сенсу дозволяти прикувати in- адже це x < y < zмає сенс, але не так вже й багатоx in y in z
BlueRaja - Danny Pflughoeft

7
@Sven Корисне: можливо. Зрозуміло: точно не. Python має намір наслідувати загальну математичну типографіку за допомогою цієї конвенції, але при використанні inцього просто більше не відбувається і робить це досить контрінтуїтивним.
Конрад Рудольф

6
@KonradRudolph: Я не раз бачив у математичних текстах думки як "1 ≤ x ∈ ∈", але я в основному з вами згоден.
Свен Марнах
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.