DeployU
Interviews / Backend Engineering / What is the difference between a shallow copy and a deep copy in Python?

What is the difference between a shallow copy and a deep copy in Python?

conceptual Core Concepts Interactive Quiz Code Examples

The Scenario

You are a backend engineer at a social media company. You are writing a new service that needs to make a copy of a nested data structure. You are not sure whether to use a shallow copy or a deep copy.

The Challenge

Explain the difference between a shallow copy and a deep copy in Python. What are the pros and cons of each approach, and which one would you choose for this use case?

Wrong Approach

A junior engineer might not be aware of the difference between a shallow copy and a deep copy. They might just use the `copy()` method without considering the implications of using a shallow copy on a nested data structure.

Right Approach

A senior engineer would be able to provide a detailed explanation of the differences between a shallow copy and a deep copy. They would also be able to explain the trade-offs between each approach and would have a clear recommendation for which one to use in this use case.

Step 1: Understand the Key Differences

FeatureShallow CopyDeep Copy
CopyingCreates a new object, but inserts references to the original objects.Creates a new object and recursively copies all the objects inside it.
MutabilityIf you modify an object in the copy, it will also be modified in the original.If you modify an object in the copy, it will not be modified in the original.
PerformanceFaster than a deep copy.Slower than a shallow copy.

Step 2: Choose the Right Tool for the Job

For our use case, we should use a deep copy. This is because we are working with a nested data structure, and we want to make sure that the copy is completely independent of the original.

Step 3: Code Examples

Here are some code examples that show the difference between the two approaches:

Shallow Copy:

import copy

old_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
new_list = copy.copy(old_list)

old_list[1][1] = 'X'

print(old_list) # [[1, 2, 3], [4, 'X', 6], [7, 8, 9]]
print(new_list) # [[1, 2, 3], [4, 'X', 6], [7, 8, 9]]

As you can see, when we modify the nested list in the old list, it is also modified in the new list.

Deep Copy:

import copy

old_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
new_list = copy.deepcopy(old_list)

old_list[1][1] = 'X'

print(old_list) # [[1, 2, 3], [4, 'X', 6], [7, 8, 9]]
print(new_list) # [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

As you can see, when we modify the nested list in the old list, it is not modified in the new list.

Practice Question

You are working with a list of objects and you want to create a new list with the same objects, but in a different order. Which of the following would be the most efficient?