Basic usage

Default arguments let you call a function without providing all parameters:

def greet(name, greeting="Hello"):
    print(f"{greeting}, {name}!")

greet("Alice")  # "Hello, Alice!"
greet("Bob", "Hi")  # "Hi, Bob!"

Multiple defaults

def create_user(name, age=18, city="Unknown"):
    print(f"Name: {name}, Age: {age}, City: {city}")

create_user("Alice")  # Uses both defaults
create_user("Bob", 25)  # Uses city default
create_user("Charlie", 30, "NYC")  # All provided

Important: mutable defaults

Never use mutable objects (lists, dicts) as default values. They're shared across calls:

# WRONG:
def add_item(item, items=[]):  # Bad!
    items.append(item)
    return items

# RIGHT:
def add_item(item, items=None):
    if items is None:
        items = []
    items.append(item)
    return items

Order matters

Parameters with defaults must come after parameters without defaults:

# Correct:
def func(a, b, c=10, d=20):
    pass

# Wrong:
# def func(a=10, b):  # SyntaxError
#     pass

When to use defaults

  • Optional parameters that have sensible defaults
  • Making functions more flexible
  • Backward compatibility (adding new optional parameters)
  • Reducing the number of function overloads needed