Python Tuples Data Structure
It is very similar to a List, but with one critical difference: it is Immutable (Unchangeable).
Think of a List as a whiteboard (you can write, erase, and rewrite).
A tuple is an ordered collection of elements stored in a single variable. It is defined using **parentheses **().
Key Characteristics:
-
Immutable: You cannot add, remove, or change items after creation.
-
Ordered: Items have a fixed position (0, 1, 2...n).
-
Allow Duplicates: (1, 1, 1) is perfectly valid.
-
Heterogeneous: Can mix data types: ("Apple", 10, True).
-
Faster: Tuples are faster and lighter on memory than lists.
2. Creating Tuples
There are specific nuances to creating tuples correctly.
1. Standard Syntax
# Standard creation
my_tuple = ("apple", "banana", "cherry")
# Mixed data types
mixed = (1, "Hello", 3.14, True)
# Without parentheses (Tuple Packing)
# Python assumes values separated by commas are a tuple
coordinates = 10, 20
print(type(coordinates)) #
2. The Constructor
# Using the built-in function (Double brackets needed)
my_tuple = tuple(("apple", "banana", "cherry"))
3. The "Comma Trap"
This is the most common mistake beginners make. Python does not recognize a single value in parentheses as a tuple unless you add a comma.
# NOT a tuple (It interprets this as a String)
not_tuple = ("apple")
print(type(not_tuple)) #
# IS a tuple (Notice the trailing comma)
is_tuple = ("apple",)
print(type(is_tuple)) #
3. Accessing Elements
Accessing tuple items works exactly like Lists.
-
Indexing: tup[0] (First item)
-
Negative Indexing: tup[-1] (Last item)
-
Slicing: tup[start:stop] (Range of items)
data = (10, 20, 30, 40, 50)
print(data[1]) # 20
print(data[-1]) # 50
print(data[1:4]) # (20, 30, 40)
4. The Immutability Rule
Once a tuple is created, you cannot change it.
x = (10, 20, 30)
# This creates an Error: 'tuple' object does not support item assignment
# x[1] = 99
The Workaround (How to Update)
If you absolutely must change a tuple, you have to "cheat" by converting it.
-
Convert Tuple → List.
-
Change the List.
-
Convert List → Tuple.
x = ("apple", "banana", "cherry")
# Step 1: Convert to Mutable List
y = list(x)
# Step 2: Change item
y[1] = "kiwi"
# Step 3: Convert back to Immutable Tuple
x = tuple(y)
print(x) # ('apple', 'kiwi', 'cherry')
5. Operations on Tuples
**Concatenation **+
Join two tuples to create a new tuple.
tuple1 = ("a", "b")
tuple2 = (1, 2)
result = tuple1 + tuple2
print(result) # ('a', 'b', 1, 2)
**Repetition ***
Repeat the tuple elements.
fruits = ("apple",)
print(fruits * 3) # ('apple', 'apple', 'apple')
6. Unpacking Tuples
Usually, we assign a tuple to a variable. Unpacking is the reverse: extracting values back into variables.
Basic Unpacking
The number of variables must match the number of items exactly.
fruits = ("apple", "banana", "cherry")
(green, yellow, red) = fruits
print(green) # apple
print(yellow) # banana
Asterisk ***** Unpacking
If you have many items and only want to grab the first few, use * to gather the rest into a list.
fruits = ("apple", "banana", "cherry", "strawberry", "raspberry")
(green, yellow, *red) = fruits
print(green) # apple
print(red) # ['cherry', 'strawberry', 'raspberry'] (List of remainders)
7. Tuple Methods
Because tuples are immutable, they only have two built-in methods.
MethodDescriptionExample.count(val)Returns number of times val appears.tup.count(5).index(val)Returns index of first occurrence of val.tup.index(5)
8. Memory Optimization
You often hear "Tuples are faster than Lists,"
-
Fixed Allocation: Lists are dynamic; they allocate extra "empty" memory in case you add items later. Tuples allocate exactly what is needed.
-
Resource Caching: Python reuses memory for small tuples more aggressively.
import sys
my_list = [1, 2, 3, 4, 5]
my_tuple = (1, 2, 3, 4, 5)
print(sys.getsizeof(my_list)) # Output: ~104 bytes (Larger)
print(sys.getsizeof(my_tuple)) # Output: ~80 bytes (Smaller)
9. The Immutability - Nested Mutability
A tuple itself cannot be changed, but objects inside it might be changeable.
If a tuple contains a List, you can modify that list!
# A tuple containing a mutable list
my_tuple = (10, 20, ["A", "B"])
# Error: Cannot replace the list itself
# my_tuple[2] = [1, 2]
# Valid: You CAN modify the list contents
my_tuple[2][0] = "Z"
print(my_tuple)
# Output: (10, 20, ['Z', 'B'])
Rule: Tuples protect the structure, not necessarily the content if the content is mutable.
10. Tuples as Dictionary Keys
Dictionaries require their keys to be Hashable (unchangeable).
-
Lists: Mutable → Not Hashable → Cannot be keys.
-
Tuples: Immutable → Hashable → Can be keys.
# Storing coordinates
locations = {
(35.6, 139.6): "Tokyo",
(40.7, -74.0): "New York"
}
11. Named Tuples
Standard tuples (1, "John") are confusing because you have to remember that index 0 is ID and 1 is Name. namedtuple solves this.
from collections import namedtuple
# 1. Define the structure
User = namedtuple("User", ["id", "name"])
# 2. Create the tuple
u1 = User(101, "Admin")
# 3. Access by name (Readable!)
print(u1.name) # Output: Admin
print(u1.id) # Output: 101
Summary Table: List vs Tuple
Feature****List []****Tuple ()****Mutable?Yes (Changeable)No (Immutable)SpeedSlowerFasterMemoryUses more memoryUses less memoryMethodsMany (append, pop, sort)Few (count, index)Use CaseData that changes (Shopping Cart)Data that is constant (Coordinates, Settings)