Python Bool and int comparison and indexing on list with boolean values

后端 未结 4 922
离开以前
离开以前 2020-12-03 17:15

Indexing on list with boolean values works fine. Though the index should be an integer.

Following is what I tried in console:

>>> l = [1,2,3         


        
相关标签:
4条回答
  • 2020-12-03 17:54

    What's going on is that booleans actually are integers. True is 1 and False is 0. Bool is a subtype of int.

    >>> isinstance(True, int)
    True
    >>> issubclass(bool, int)
    True
    

    So it's not converting them to integers, it's just using them as integers.

    (Bools are ints for historical reasons. Before a bool type existed in Python, people used the integer 0 to mean false and 1 to mean true. So when they added a bool type, they made the boolean values integers in order to maintain backward compatibility with old code that used these integer values. See for instance http://www.peterbe.com/plog/bool-is-int .)

    >>> help(True)
    Help on bool object:
    
    class bool(int)
     |  bool(x) -> bool
     |  
     |  Returns True when the argument x is true, False otherwise.
     |  The builtins True and False are the only two instances of the class bool.
     |  The class bool is a subclass of the class int, and cannot be subclassed.
    
    0 讨论(0)
  • 2020-12-03 17:56

    Python used to lack booleans, we just used integers, 0 for False and any other integer for True. So when booleans were added to the language, the values False and True, can be treated as the integer values 0 and 1 still by the interpreter, to help backwards compatibility. Internally, bool is a sub-class of int.

    In other words, the following equations are True:

    >>> False == 0
    True
    >>> True == 1
    True
    >>> isinstance(True, int)
    True
    >>> issubclass(bool, int)
    True
    

    and as you found out:

    >>> True * 3
    3
    

    This doesn't extend to strings however.

    0 讨论(0)
  • 2020-12-03 18:01

    The Python source documentation does not mention directly that all non-zero integers are evaluate to True when passed to an if statement, while only zero evaluates to False. You can prove it to yourself with the following code in Python:

    for test_integer in range(-2, 3, ):
        if not test_integer:
            print('{} evaluates to False in Python.'.format(test_integer))
        else:
            print('{} evaluates to True in Python.'.format(test_integer))
    >>>-2 evaluates to True in Python.
    -1 evaluates to True in Python.
    0 evaluates to False in Python.
    1 evaluates to True in Python.
    2 evaluates to True in Python.
    

    Try it for as far on either side of zero as you want; this code only shows for -2, -1, 0, 1, and 2 inclusive.

    0 讨论(0)
  • 2020-12-03 18:13

    ...Booleans are a subtype of plain integers.

    Source.

    As you can see, False is 0 and True is 1.

    0 讨论(0)
提交回复
热议问题