1 Востаннє редагувалося ping (02.12.2018 09:57:23)

Тема: як це пояснити?

як це пояснити?

>>> 'A' in 'A'

>>> 'A' in 'A' == True

>>> bool('A' in 'A') == True

Підозрюю,що в проблема в in, але по документації не бачу можливостей для такої поведінки:

6.10.2. Membership test operations

The operators in and not in test for membership. x in s evaluates to True if x is a member of s, and False otherwise. x not in s returns the negation of x in s. All built-in sequences and set types support this as well as dictionary, for which in tests whether the dictionary has a given key. For container types such as list, tuple, set, frozenset, dict, or collections.deque, the expression x in y is equivalent to any(x is e or x == e for e in y).

For the string and bytes types, x in y is True if and only if x is a substring of y. An equivalent test is y.find(x) != -1. Empty strings are always considered to be a substring of any other string, so "" in "abc" will return True.



Re: як це пояснити?


This is due to comparison operator chaining. From the documentation:

    Comparisons can be chained arbitrarily, e.g., x < y <= z is equivalent to x < y and y <= z, except that y is evaluated only once (but in both cases z is not evaluated at all when x < y is found to be false).

You are assuming that the 9 in list == False expression is executed as (9 in list) == False but that is not the case.

Instead, python evaluates that as (9 in list) and (list == False) instead, and the latter part is never True.

You really want to use the not in operator, and avoid naming your variables list:

if 9 not in lst:

https://stackoverflow.com/questions/153 … -code-work

Подякували: Eff1c1