What is mutable versus immutable?

Laptop computer with binary codes on screen at a desk

Authors

Gregg Lindemulder

Staff Writer

IBM Think

Annie Badman

Staff Writer

IBM Think

What is mutable versus immutable?

Mutable versus immutable describes whether systems, infrastructure or data can be changed after creation. Mutable resources can be modified in place. Immutable resources cannot be changed—any modification creates a new instance.

Mutable versus immutable is a principle that drives modern approaches to both software development and infrastructure management.

The distinction can be compared to writing text on a whiteboard. If you can add words, erase parts or change what’s written, that’s like a mutable resource. But if the whiteboard is sealed under glass the moment you finish and you must use a new whiteboard to write something else, that’s an immutable resource.

While this concept applies broadly across computing, it’s most commonly encountered in programming. In programming, understanding which data types can be modified directly versus when a new copy must be created is essential for common tasks. These tasks include writing algorithms, building application programming interfaces (APIs) and designing classes in object-oriented programming (OOP).

The choice of using mutable or immutable objects affects how data is managed in memory, how safely it can be shared or changed and whether unintended side effects might occur. This is the reason why mutable versus immutable is a foundational concept for both beginner and experienced programmers.

For example, in the Python programming language, lists and dictionaries are mutable types. Items can be added, removed or modified within those objects. In contrast, objects such as booleans (true or false values) or tuples—ordered collections like (1,2,3)—are immutable types. Their contents cannot be changed or mutated without creating an entirely new object.

The latest tech news, backed by expert insights

Stay up to date on the most important—and intriguing—industry trends on AI, automation, data and beyond with the Think newsletter. See the IBM Privacy Statement.

Thank you! You are subscribed.

Your subscription will be delivered in English. You will find an unsubscribe link in every newsletter. You can manage your subscriptions or unsubscribe here. Refer to our IBM Privacy Statement for more information.

Selecting mutable versus immutable types

Choosing between mutable and immutable data generally depends on three key factors: whether data needs frequent updates, is shared across threads or requires version history. 

Mutable types: uses and benefits

Mutable types generally work best when data needs frequent updates and multiple parts of a program modify the same object.

Efficient updates

Mutable objects modify data in place, reducing memory use by avoiding the need to create new objects. It can lower the processor usage of garbage collection—the process of removing unused data to free memory—because fewer temporary objects might need to be created and collected.

For example, shopping carts in apps use mutable lists to add or remove items directly without creating new objects for each change.

Faster performance 

Mutable types perform better with frequently changing data—such as growing lists or real-time counters—because they update existing objects rather than creating new ones. This efficiency speeds up operations in data structures that rely on quick modifications.

For instance, a music app’s playlist can use a mutable list to make quick updates. It can do that in microseconds when a song is added or deleted, compared to re-creating a 1,000 song playlist for each change.

Shared state 

Mutable objects let multiple parts of a program access and change the same object. This process enables them to work with a shared state—the data that multiple components read and write to coordinate their actions. It is useful when components need to coordinate or communicate through common data.

For example, a project management app uses mutable objects to share task lists, calendars and notifications. When one team member updates a task, everyone sees the change immediately.

Immutable types: uses and benefits

Immutable types typically work best when data should not change after its creation. It is especially important in applications with concurrency, where multiple parts of a program access the same data.

Predictability

Because the state of an immutable object is fixed, it won’t be altered by other code. This feature makes programs more predictable and easier to understand because it eliminates bugs related to unexpected mutations.

For example, banking apps frequently store transaction records as immutable objects so no code can alter them later. It is critical for helping ensure regulatory compliance and maintaining audit trails that prove transactions haven’t been tampered with.

Thread safety

Immutable objects are generally thread-safe because their state cannot change after creation. Multiple threads can safely read them simultaneously without conflicts, though developers still need to manage references carefully in concurrent systems. It makes them ideal for multi-threaded programs, where multiple threads must access the same data without causing conflicts.

For instance, a weather app can run concurrent threads for current conditions, forecasts and alerts. Storing weather data as immutable objects means that each thread can read the same information without the risk of it changing unexpectedly.

Easier debugging

Immutable objects can simplify debugging because values do not change unexpectedly during program execution. This feature can reduce bugs caused by side effects and help teams resolve issues faster.

For example, video games frequently store health and stats for players as immutable objects. Because these values can’t change unexpectedly, developers can easily track down bugs knowing that unrelated code won’t alter stats.

Mixture of Experts | 12 December, episode 85

Decoding AI: Weekly News Roundup

Join our world-class panel of engineers, researchers, product leaders and more as they cut through the AI noise to bring you the latest in AI news and insights.

Programming approaches to mutable versus immutable

Two of the most widely used styles of programming—object-oriented programming (OOP) and functional programming—approach mutability differently.

OOP often embraces mutability, building programs around objects that hold both data and behaviors. These objects can change over time by using special functions called setters, which can update the value of a property (for example, changing a person’s age or a product’s price).

In contrast, functional programming leans toward immutability. It creates and returns new values whenever something needs to change, making programs more predictable and easier to test.

Programming languages also vary in their approach to mutable versus immutable types.

Python

In Python, both mutable and immutable types are common.

One example is strings—sequences of characters such as names or sentences. Strings in Python are immutable. Appending new text creates a new string object. In contrast, lists are mutable. These ordered collections are iterable—you can add, remove or modify items within the list object.

Instead of using a compiler (a program that converts code into machine language before execution) to check code before it runs, Python checks types at run time. It means that errors are caught only while the program is running. Mistakes involving mutability—such as trying to modify an immutable string—trigger a TypeError.

If the error isn’t handled, it stops the program immediately, preventing any further code from running. This procedure enables faster development but requires careful attention to type handling.

Understanding mutability in Python helps prevent errors when sharing data between functions or working within a shared module. Tutorials and code examples on GitHub provide best practices for using Python’s built-in types.

JavaScript

JavaScript uses both mutable and immutable types. Like Python, strings are also immutable. However, unlike Python, all objects are mutable by default.

JavaScript’s flexible syntax supports both object-oriented and functional styles, allowing developers to manage mutability as needed.

Java™

Similar to Python, Java strings are immutable. Once created, a string’s value cannot change. This characteristic can be inefficient for programs that build or modify text frequently.

To address this issue, Java provides StringBuilder—a mutable string class that allows text to be modified directly without creating new objects. It can improve performance and reduce memory use, balancing immutability’s safety with mutability’s performance benefits.

C++

C++ uses the const keyword to mark variables, functions and even entire objects as read-only. It can give developers fine-grained control over mutability, effectively turning a mutable object into an immutable one by preventing changes.

Like Java, C++ strings can be mutable or immutable, depending on their implementation.

C++ supports both object-oriented and functional programming styles. In the OOP style, developers modify existing objects over time, while functional programming creates new values instead of changing existing data. 

Mutable versus immutable beyond programming 

The principles of mutability versus immutability extend beyond programming to infrastructure and systems. Modern software engineers apply these same concepts when designing cloud architectures and deployment pipelines.

Mutable infrastructure

Mutable infrastructure refers to servers or other IT resources that can be changed after deployment. For example, you might log in to a server and manually update software, change configurations or install patches. While this approach offers flexibility, it can lead to configuration drift where servers become unique “snowflakes” and changes become impossible to track or reproduce.

Immutable infrastructure

Immutable infrastructure means that servers or IT resources cannot be changed after deployment. Instead of updating running systems, teams deploy new instances with changes built-in, then retire old ones. This approach reduces configuration drift, simplifies rollback and helps ensure consistent deployments.

Other applications

The principles of mutability and immutability can also apply to other areas of software and system design.

Databases

Some databases use append-only logs, meaning each change is recorded permanently and cannot be altered. Others are mutable, allowing updates or deletion of data directly, like editing a document.

Cloud storage

Certain cloud storage systems can be configured as immutable storage to keep previous versions and lock them from changes. This helps protect data from being accidentally changed or deleted. Mutable storage allows files to be edited or replaced at any time.

Version control systems

Many version control tools, such as Git, follow an immutable model, where each commit is saved as a separate, unchangeable snapshot. It helps ensure a reliable history of versions, even as new changes are added.