True vs Truthy in Python: Absolute Beginners Tutorial

Every Python object carries a hidden boolean identity. When you write if my_list:, Python does not check whether my_list literally equals True. Instead, it asks a simpler question: is this value truthy? Understanding that distinction is one of the first steps toward writing clean, idiomatic Python.

If you have written even a single if statement in Python, you have already used truth value testing. Python does not require you to compare a value to True or False explicitly. It can evaluate any object and decide whether it counts as true or false in that context. The two terms you need to know are truthy (evaluated as True) and falsy (evaluated as False). This tutorial walks through exactly how that works, which values fall on each side, and how to use this knowledge to write better conditionals.

True and False Are Just the Starting Point

Python has exactly two boolean literals: True and False. They belong to the bool type, and they are the values you get back from comparison operators like ==, >, and in. But here is where things get interesting. Python lets you put any object where a boolean is expected. When you write if my_variable:, Python does not demand that my_variable be True or False. It just needs to know whether the value should be treated as true or false in that moment. That treatment is what we call truthiness.

Think of it this way: True is truthy, but truthy is not always True. The number 42 is truthy. The string "hello" is truthy. A list with items in it is truthy. None of these are the boolean True, but Python treats them as true when it needs a yes-or-no answer.

Note

True is a specific Python constant. Truthy describes any value that Python interprets as True when evaluated in a boolean context. Every truthy value behaves like True in an if statement, but it is not necessarily the literal True.

Pro Tip

A simple heuristic: a value is falsy when it represents "empty" or "nothing." An empty string has no characters. An empty list has no items. Zero has no magnitude. None has no value at all. Everything else has substance, so it is truthy.

python
print(type(True))    # <class 'bool'>
print(type(False))   # <class 'bool'>
print(10 > 3)        # True
print(10 == 3)       # False

# These are all truthy but NOT the literal True
print(bool(42))      # True
print(bool("hello")) # True
print(bool([1, 2]))  # True

# These are all falsy
print(bool(0))       # False
print(bool(""))      # False
print(bool([]))      # False
print(bool(None))    # False
"By default, an object is considered true." — Python Documentation, Built-in Types
code builder click a token to place it

Build a conditional that checks whether a list is truthy (non-empty) and prints its length:

your code will appear here...
print(len(items)) == True if : bool(items) items

The Complete Falsy Values List

Section content goes here.

Type
bool, NoneType
Why falsy
The boolean constant for false and the singleton representing absence of a value. Both are always falsy.
Type
Numeric types (int, float, complex, Decimal, Fraction)
Why falsy
Any numeric value that equals zero in its type is falsy. Every other number is truthy, including negative numbers like -1.
Type
Empty sequences and collections
Why falsy
Any sequence or collection with a length of zero is falsy. As soon as it contains at least one element, it becomes truthy.
spot the bug click the line that contains the bug

This function should return True only when the user provides a non-empty name. Find the line with the logic error:

1 def has_name(name):
2 if name == True:
3 return True
4 return False
The fix: Change if name == True: to if name:. Comparing a string to True with == will always return False because no string is literally equal to the boolean True. Using if name: tests truthiness instead, which correctly evaluates to True for any non-empty string.

Using bool() to Reveal Truthiness

Python provides the built-in bool() function that converts any value to its boolean equivalent. It applies the standard truth testing procedure and returns either True or False. This is the same evaluation Python performs internally when you use a value in an if or while statement.

python
# Surprising truthy values
print(bool(" "))       # True  (space character, length 1)
print(bool("0"))       # True  (string "0", length 1)
print(bool("False"))   # True  (string "False", length 5)
print(bool([0]))       # True  (list with one item)
print(bool(-7))        # True  (negative numbers are truthy)

# Falsy values
print(bool(0))         # False
print(bool(0.0))       # False
print(bool(""))        # False
print(bool([]))        # False
print(bool(None))      # False
print(bool(range(0)))  # False

Notice that negative numbers like -7 are truthy. The only numeric zero values are falsy. A string containing just a space character " " is truthy because it has a length of 1. The same logic applies to a list containing a single falsy element: [0] is truthy because the list itself is not empty, even though the value inside it is falsy.

How Python Decides Truthiness Internally

When Python needs a boolean answer from an object, it follows a specific lookup order. First, it checks whether the object's class defines a __bool__() method. If __bool__() exists, Python calls it and uses whatever it returns. If __bool__() does not exist, Python looks for a __len__() method instead. If the length is zero, the object is falsy; otherwise it is truthy. If neither method exists, the object is truthy by default.

python
class Wallet:
    def __init__(self, balance):
        self.balance = balance

    def __bool__(self):
        return self.balance > 0

empty_wallet = Wallet(0)
full_wallet = Wallet(50)

print(bool(empty_wallet))   # False
print(bool(full_wallet))    # True

if full_wallet:
    print("You have funds")  # This prints

How to Test Truth Values in Python

Follow these steps to determine whether any Python value is truthy or falsy.

  1. Pick Any Python Value

    Start with any Python value you want to test, such as a number, string, list, None, or a custom object. Assign it to a variable like value = "" for clarity.

  2. Pass It to the bool() Function

    Call bool(value) and print the result. Python applies its standard truth testing procedure and returns either True or False. For example, print(bool("")) outputs False.

  3. Use the Value in a Conditional

    Place your value directly inside an if statement without comparing it to True or False. Python evaluates its truthiness automatically. Write if value: print("truthy") to see it in action. When in doubt, check the falsy list: False, None, 0, 0.0, 0j, empty string, empty list, empty tuple, empty dict, empty set, and empty range. Everything else is truthy.

"By default, an object is considered true." — Python Documentation, Built-in Types

Truthy and Falsy in Real Code

Understanding truthiness lets you write shorter, more readable conditionals. Instead of explicitly comparing against empty values, you can let Python do the work.

python
# Instead of this:
if len(users) > 0:
    print("Users found")

# Write this:
if users:
    print("Users found")

# Instead of this:
if name != "":
    greet(name)

# Write this:
if name:
    greet(name)
Warning

Be careful when a variable can legitimately be 0 and you still need to process it. In that case, if result: will skip valid data. Check for None explicitly with if result is not None: instead.

Short-Circuit Evaluation with and / or

Python's and and or operators rely on truthiness and return one of their operands rather than a strict boolean. The or operator returns the first truthy operand it finds, or the last operand if all are falsy. The and operator returns the first falsy operand, or the last operand if all are truthy.

python
# or returns the first truthy value
name = "" or "Guest"
print(name)  # "Guest"

# and returns the first falsy value
result = [] and "data"
print(result)  # []

# Common default value pattern
username = input_name or "Anonymous"

Common Pitfalls and Gotchas

The == True Trap

Comparing a value to True with == does not test truthiness. It tests whether the value is literally equal to the boolean True. This creates surprising results because bool is a subclass of int in Python, so True equals 1 and False equals 0.

python
# The == True trap
print(1 == True)       # True  (because True == 1)
print(5 == True)       # False (5 is not equal to 1)
print(bool(5))         # True  (5 IS truthy though)

# These behave differently:
if 5 == True:
    print("equal")     # Does NOT print

if 5:
    print("truthy")    # Prints "truthy"

The String "False" Is Truthy

Strings are truthy based on their length, not their content. The string "False" has five characters and is truthy. The string "0" has one character and is truthy. Only the empty string "" is falsy.

None vs Falsy

When you specifically need to know whether a value is None, use is None instead of relying on falsiness. The value 0, an empty string, and None are all falsy, but they represent very different things.

python
def get_age(name):
    ages = {"Alice": 30, "Baby": 0}
    return ages.get(name)  # Returns None if not found

age = get_age("Baby")

# Bug: this skips age 0 because 0 is falsy
if age:
    print(f"Age: {age}")

# Correct: check for None explicitly
if age is not None:
    print(f"Age: {age}")  # Prints "Age: 0"

Python Learning Summary Points

  1. True and False are Python's two boolean literals. Truthy and falsy describe how any object is evaluated in a boolean context like an if or while statement.
  2. The falsy values are: False, None, numeric zeros (0, 0.0, 0j), and all empty sequences and collections ("", [], (), {}, set(), range(0)).
  3. Everything not on the falsy list is truthy, including negative numbers, strings containing the text "False" or "0", and lists containing falsy elements.
  4. Use bool() to inspect the truthiness of any value. It applies the same logic Python uses internally in conditionals.
  5. Avoid if x == True: in your code. Write if x: to check truthiness, and use is None or is not None when you need to distinguish None from other falsy values.
  6. Custom classes are truthy by default. Define __bool__() or __len__() to control the boolean behavior of your own objects.
  7. Python's and and or operators return one of their operands, not necessarily True or False. They use short-circuit evaluation based on truthiness.

Truthiness is one of those Python features that seems small until you realize it is everywhere. Every if check on a list, every default value set with or, every while loop that watches a counter -- they all depend on the truth testing rules covered here. Once this concept clicks, you will start recognizing patterns in other people's code that looked confusing before, and your own conditionals will become cleaner and more Pythonic.

check your understanding question 1 of 5

Frequently Asked Questions

True is the boolean literal constant in Python, one of two values in the bool type. Truthy refers to any value that Python evaluates as True when placed in a boolean context such as an if statement. For example, the integer 7 is not True itself, but it is truthy because bool(7) returns True.

Python's falsy values include: the boolean False, the None singleton, numeric zeros (0, 0.0, 0j, Decimal(0), Fraction(0, 1)), empty sequences and collections (empty string '', empty list [], empty tuple (), empty dict {}, empty set set(), empty range range(0), empty bytes b''), and any user-defined object whose __bool__() returns False or whose __len__() returns 0.

The bool() function converts any Python object to a boolean value using the standard truth testing procedure. It returns True for truthy values and False for falsy values. For example, bool(42) returns True, bool(0) returns False, bool("hello") returns True, and bool("") returns False.

The string "0" is truthy in Python. Only the empty string "" is falsy. The string "0" has a length of 1, so it evaluates to True. This catches beginners off guard because the integer 0 is falsy, but its string representation "0" is truthy.

Define a __bool__() method in your class that returns True or False. If __bool__() is not defined, Python falls back to __len__(), treating the object as falsy when its length is 0. If neither method is defined, all instances of the class are truthy by default.