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 (opens in a new tab)
  • Syntax.fmListen to the Syntax Podcast (opens in a new tab)
  • Sentry BlogLogging in Python: A Developer’s Guide (opens in a new tab)
  • CodecovPython - Codecov (opens in a new tab)
  • Syntax.fm logo
    Listen to the Syntax Podcast (opens in a new tab)

    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 150,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.