I’ve found that tuples are one of the most reliable tools in a developer’s toolkit. They are fast, memory-efficient, and because they are immutable, they provide a level of data safety that lists simply cannot match.
But that immutability often trips up developers when they need to combine data. Since you can’t “append” to a tuple, you have to concatenate them to create a new one.
We needed to merge these data points millions of times per second, and choosing the wrong concatenation method actually slowed down our entire pipeline.
In this tutorial, I’ll share the exact methods I use to concatenate tuples in Python, from the simplest operators to high-performance library functions.
Method 1: Use the Addition (+) Operator
The simple way to join two tuples is by using the + operator. This is my “go-to” method for simple scripts or when I’m only dealing with two or three tuples.
When you use the plus operator, Python takes the elements from the first tuple and the second tuple and packages them into a brand-new tuple object.
I often use this when I’m managing configuration settings for a cloud-based app where I need to combine a “default” set of parameters with “user-specific” overrides.
east_coast_offices = ("New York", "Boston", "Miami")
west_coast_offices = ("San Francisco", "Seattle", "Los Angeles")
# Concatenating using the + operator
all_us_offices = east_coast_offices + west_coast_offices
print("All US Office Locations:")
print(all_us_offices)
# Output: ('New York', 'Boston', 'Miami', 'San Francisco', 'Seattle', 'Los Angeles')I executed the above example code and added the screenshot below.

As you can see, the original tuples remain unchanged, which is exactly what we want for data integrity.
Method 2: Use the Asterisk (*) Unpacking Operator
If you are using Python 3.5 or later, the unpacking operator (often called “splat”) is a very elegant way to merge multiple tuples.
In my experience, this method is significantly more readable when you have more than two tuples to join. It feels more “Pythonic” to many senior developers.
I frequently use this when I’m building data rows for a CSV report, perhaps combining a user’s ID, their transaction history, and their shipping address in one go.
user_id = (10245,)
transaction_items = ("MacBook Pro", "Magic Mouse", "USB-C Hub")
shipping_info = ("Austin", "Texas", 78701)
# Concatenating multiple tuples using unpacking
unified_record = (*user_id, *transaction_items, *shipping_info)
print("Unified Transaction Data:")
print(unified_record)
# Output: (10245, 'MacBook Pro', 'Magic Mouse', 'USB-C Hub', 'Austin', 'Texas', 78701)I executed the above example code and added the screenshot below.

Notice how I added a comma in (10245,). In Python, a single-element tuple must have that trailing comma, or it will just be treated as an integer in parentheses.
Method 3: Use the itertools.chain() Function
When I’m working with massive datasets, like processing thousands of IoT sensor readings from a factory in Detroit, I avoid creating large intermediate objects.
The itertools.chain() function is perfect for this because it’s memory-efficient. It doesn’t actually “build” the new tuple until you explicitly ask for it.
Instead, it creates an iterator that yields elements from the first tuple, then the second, and so on.
import itertools
morning_mentions = ("@PythonGuides", "@DeveloperLife", "@CodingTips")
afternoon_mentions = ("@TechNews", "@Innovation", "@SoftwareEngineering")
evening_mentions = ("@PythonDev", "@DataScience", "@MachineLearning")
# Using itertools.chain for efficient concatenation
chained_iterator = itertools.chain(morning_mentions, afternoon_mentions, evening_mentions)
# Convert the iterator to a tuple at the final step
all_mentions = tuple(chained_iterator)
print("Total Daily Mentions:")
print(all_mentions)I executed the above example code and added the screenshot below.

I recommend this approach whenever performance is a concern or when you are joining a variable number of tuples that are passed as a list.
Method 4: Use the sum() Function
Most people think of sum() for adding numbers, but you can actually use it to concatenate a collection of tuples.
To make this work, you have to provide an empty tuple () as the second argument (the “start” value). Otherwise, Python tries to add the tuples to the integer 0, which causes a TypeError.
I find this method particularly useful when I have a list of tuples, and I want to “flatten” them into a single sequence.
# A list containing tuples of sales figures from different US regions
regional_sales = [
(450.50, 1200.00), # Northeast
(800.00, 300.75), # Midwest
(1500.25, 2100.50) # West
]
# Concatenating all tuples in the list into one
total_sales_stream = sum(regional_sales, ())
print("Combined Sales Stream:")
print(total_sales_stream)
# Output: (450.5, 1200.0, 800.0, 300.75, 1500.25, 2100.5)One word of caution: while this is clever, it can be slow for very long lists because it creates a new temporary tuple at every step of the addition.
Method 5: Use List Conversion (Extend)
Sometimes, I need to do more than join tuples. I might need to sort the elements or remove duplicates before the final result is locked in.
In these cases, I convert the tuples to lists, use the extend() method, and then convert them back.
This is a common pattern I use when handling user permissions: I combine “Standard” and “Admin” permissions and sort them alphabetically.
standard_perms = ("read", "execute")
admin_perms = ("write", "delete", "sudo")
# Convert to list to allow modification
temp_list = list(standard_perms)
temp_list.extend(admin_perms)
# Perform additional logic like sorting
temp_list.sort()
# Convert back to an immutable tuple
final_permissions = tuple(temp_list)
print("Sorted System Permissions:")
print(final_permissions)
# Output: ('delete', 'execute', 'read', 'sudo', 'write')It’s an extra step, but the flexibility it provides is often worth the microsecond of overhead.
Why You Can’t “Change” a Tuple
I often get asked by junior developers why we can’t just use my_tuple.append(). It’s important to remember that tuples are immutable.
Once a tuple is created in memory, its contents cannot be altered. This is why all the methods above involve creating a new tuple.
In my experience, this immutability is a feature, not a bug. It prevents accidental data corruption in large-scale applications where multiple functions might be accessing the same data.
Performance Comparison: Which One Should You Use?
In the Chicago project I mentioned earlier, we ran benchmarks on these methods. Here is what we found for standard use cases:
- For 2-3 tuples: The
+operator is usually the fastest and easiest to read. - For many tuples: itertools.chain() is the clear winner for memory efficiency.
- For code readability: The
*unpacking operator is often preferred by modern Python teams.
If you are just starting, stick with the + operator. As your data grows, look into itertools.
I hope this tutorial helped you understand the different ways to concatenate tuples in Python.
The next time you’re building an application and need to merge data structures, you’ll know exactly which tool to grab from your belt.
You may also like to read:
- Check If a Variable is None
- Swap Three Variables Without Using Temporary Variables in Python
- Print New Line after a Variable in Python
- Declare a Variable Without Assigning it a Value in Python

I am Bijay Kumar, a Microsoft MVP in SharePoint. Apart from SharePoint, I started working on Python, Machine learning, and artificial intelligence for the last 5 years. During this time I got expertise in various Python libraries also like Tkinter, Pandas, NumPy, Turtle, Django, Matplotlib, Tensorflow, Scipy, Scikit-Learn, etc… for various clients in the United States, Canada, the United Kingdom, Australia, New Zealand, etc. Check out my profile.