Sentry Answers>Python>

Clone a list in Python

Clone a list in Python

David Y.

The Problem

After I attempt to copy a list by setting new_list = old_list, any modifications to new_list also affect old_list. What is the proper way to clone a list and avoid this?

The Solution

The code new_list = old_list does not create a second list, but merely causes new_list to reference the same list object as old_list. To make new_list an independent copy of old_list, we must explicitly copy the list. We can do this in two ways:

  • Shallow copy: Creates a new list, but does not create copies of the objects that the original list references. Both the original and the cloned list will still reference the same objects.
  • Deep copy: Creates a new list and creates copies of every object in the original list references, recursively, ensuring that the two lists are entirely independent.

Performing a shallow copy is sufficient for lists containing simple, immutable types, such as numbers and strings. If a list contains other lists, dictionaries, or custom objects, a deep copy will be required.

We can use one of three methods to make a shallow copy:

  1. list.copy: The list.copy method makes a shallow copy of the original list:

    Click to Copy
    old_list = [1, 2, 3, 4, 5] new_list = old_list.copy()
  2. List slicing: We can also create a clone of a list using list slicing:

    Click to Copy
    new_list = old_list[:]

    This creates a new list by slicing the old list from its first to its final element. It is identical to list.copy but may be less clear.

  3. Using the list constructor: We can also create a new list from the existing list by passing it to the list constructor.

    Click to Copy
    new_list = list(old_list)

    Again, this syntax produces identical results to the copy method but may be less clear.

To make a deep copy of the list, we must use the deepcopy function from Python’s built-in copy module:

Click to Copy
import copy old_list = [[1, 2], [3, 4]] new_list = copy.deepcopy(old_list) new_list[0][1] = 5 # change inner list in copy print(old_list) # will print [[1, 2], [3, 4]] print(new_list) # will print [[1, 5], [3, 4]]
  • Sentry BlogPython Performance Testing: A Comprehensive Guide
  • Syntax.fmListen to the Syntax Podcast
  • Sentry BlogLogging in Python: A Developer’s Guide
  • Syntax.fm logo
    Listen to the Syntax Podcast

    Tasty treats for web developers brought to you by Sentry. Get tips and tricks from Wes Bos and Scott Tolinski.

    SEE EPISODES

Considered “not bad” by 4 million developers and more than 100,000 organizations worldwide, Sentry provides code-level observability to many of the world’s best-known companies like Disney, Peloton, Cloudflare, Eventbrite, Slack, Supercell, and Rockstar Games. Each month we process billions of exceptions from the most popular products on the internet.

© 2024 • Sentry is a registered Trademark
of Functional Software, Inc.