Question: I'm asking this because I know that the pythonic way to check whether a list is empty or not is the following: 

```
my_list = []
if not my_list:
    print "computer says no"
else:
    # my_list isn't empty
    print "computer says yes"

```

will print `computer says no`, etc. So this leads me to identify `[]` with `False` truth-values; however, if I try to compare [] and False "directly", I obtain the following: 

```
>>> my_list == False
False
>>> my_list is False
False
>>> [] == False
False

```

etc... 

What's going on here? I feel like I'm missing something really obvious.

Answer: 
Empty containers are "falsy," that is, they evaluate to `False` *in a Boolean context*. That doesn't mean they are literally equal to the constant `False`.

In other words, the following is `True`:

```
bool([]) == False

```

The truth value of an object is determined by its `__nonzero__()` or its `__len__()` method. (In Python 3, `__nonzero__()` has been renamed to `__bool__()`.) Containers have a `__len__()` method, so they are truthy when they have anything in them and falsy when they are empty.

If empty containers were literally equal to `False`, by the way, then any empty container would be equal to any other empty container: for example, `{} == ""` would be `True`. And that just wouldn't make any sense at all!

However, just to blow your mind, the following is `True`:

```
False == 0

```

This is because Booleans are a subclass of integers in Python, and `False` is basically just a zero that gets printed a little differently.
Built-in types in Python have a truth value which allows you to test them for truthfulness. See *[Truth Value Testing](http://docs.python.org/library/stdtypes.html#truth-value-testing)*.

This is different than saying `object == False` which is doing an actual value test (equality test). It is using the objects `__eq__()` method to determine if their values are equal.