Lists Are Ordered, Mutable Sequences
The list is the single most-used collection type in Python. If you're keeping an ordered set of values that might change — add, remove, sort, update — a list is almost always the right choice.
You create one with square brackets:
Lists can hold anything, even other lists. In practice, most lists end up holding one kind of thing — a list of users, a list of numbers — because that's what's easiest to reason about.
Indexing
Each item has a position, starting at 0. Access with square brackets:
Asking for an index that doesn't exist raises IndexError. If you might be out of range, either check the length first or wrap the access in a try.
Slicing
Slicing gives you a range of items. The syntax is list[start:stop:step], same as strings:
Two things worth locking in:
- Slicing always returns a new list. Modifying the slice doesn't affect the original.
- The stop index is exclusive —
nums[2:5]gives indices 2, 3, and 4, not 5.
How to Append, Extend, and Insert Items
The three "adding to a list" methods do different things, and mixing them up is a common source of bugs:
append(x)addsxas a single element — even ifxis a list.items.append([1, 2])adds the list itself as one entry.extend(iterable)adds each item from the iterable.items.extend([1, 2])adds two entries.insert(i, x)inserts at a specific index, shifting everything at or afterione position to the right.
+= with a list on the right works like extend:
And for removing:
If you try to remove() something that isn't in the list, Python raises ValueError. If you need "remove if present," either check in first or use a try.
You can also delete by index with del:
Length, Membership, Counting
in is the readable way to check whether a list contains a value. If you'll be asking that question many times over a large list, use a set instead — set membership is O(1) where list membership is O(n).
Sorting
Two ways, and the choice matters:
Both accept reverse=True for descending order:
And a key function for custom ordering:
key is applied to each item, and the result is what gets compared. Common cases: sorting by length, by a specific attribute, or by the lowercase form of a string.
Reversing
Three flavours, depending on what you need:
Use in-place when you don't need the original. Use slicing when you want a new copy. Use reversed() when you just need to iterate in reverse without materializing a new list.
The Shared-Reference Trap
Lists are mutable, and variables are references. That means two variables can point at the same list:
b = a didn't copy the list; it made b a second name for the same list. If you want a copy, ask for one:
This bites every Python programmer at least once. Remember: = between two lists doesn't copy.
Looping and Building
You already know the basic pattern from the for loop page:
That's readable and will always be fine. Once you're comfortable, the list comprehension equivalent does the same thing in one line:
We'll cover comprehensions in detail two pages from now.
A Quick Cheat Sheet
Methods worth knowing, at a glance:
append(x)— add to endextend(iter)— add each item from an iterableinsert(i, x)— insert at index ipop()/pop(i)— remove and returnremove(x)— remove first occurrence of xsort()/sort(key=...)/sort(reverse=True)reverse()index(x)— position of first xcount(x)— number of x'scopy()— shallow copy
Up Next
Lists are the workhorse. Next we'll look at tuples — their immutable cousin — and when reaching for a tuple instead is the better call.
Frequently Asked Questions
How do I create a list in Python?
Use square brackets with comma-separated values: fruits = ['apple', 'banana', 'cherry']. Lists can hold any type, and you can mix types in the same list, though most real lists are homogeneous by habit.
How do I sort a list in Python?
Call .sort() on the list to sort it in place, or use the sorted(list) built-in to get a new sorted list without changing the original. Both accept a reverse=True flag for descending order and a key= argument for custom sort keys.
How do I reverse a list in Python?
list.reverse() reverses in place. list[::-1] returns a new reversed list. reversed(list) returns an iterator you can loop over. Pick whichever matches your need: in-place vs. new copy vs. lazy iteration.