
Table of Contents(目次)
How to Copy Python Tuples and Key Considerations
Since tuples are immutable, even if you reference the same data as shown in the code below, issues that typically occur with copying lists generally do not happen.
num_tuple1 = (1, 2, 3)
num_tuple2 = num_tuple1
print(num_tuple1, type(num_tuple1), id(num_tuple1)) # (1, 2, 3) <class 'tuple'> 2324937423040
print(num_tuple2, type(num_tuple2), id(num_tuple2)) # (1, 2, 3) <class 'tuple'> 2324937423040
For this reason, when copying a tuple using a full slice ([:]
), Python does not create a new tuple but references the original tuple. (Tuples also do not have a copy()
method.)
num_tuple1 = (1, 2, 3)
num_tuple2 = num_tuple1[:]
print(num_tuple1, type(num_tuple1), id(num_tuple1)) # (1, 2, 3) <class 'tuple'> 2413960870208
print(num_tuple2, type(num_tuple2), id(num_tuple2)) # (1, 2, 3) <class 'tuple'> 2413960870208
Cases Where Tuple Copying Can Cause Issues (Containing Mutable Objects)
As explained above, if tuple elements are numbers or strings, issues do not arise due to the tuple's immutability. However, if a tuple contains mutable objects like lists, problems can occur.
num_tuple1 = ([1, 2, 3],)
num_tuple2 = num_tuple1[:]
num_tuple2[0][0] = 99
print(num_tuple1, type(num_tuple1), id(num_tuple1)) # ([99, 2, 3],) <class 'tuple'> 2173609641440
print(num_tuple2, type(num_tuple2), id(num_tuple2)) # ([99, 2, 3],) <class 'tuple'> 2173609641440
print(num_tuple1[0], type(num_tuple1[0]), id(num_tuple1[0])) # [99, 2, 3] <class 'list'> 1822000033408
print(num_tuple2[0], type(num_tuple2[0]), id(num_tuple2[0])) # [99, 2, 3] <class 'list'> 1822000033408
The above code demonstrates modifying the first element of a list ([1, 2, 3]
) contained as the first element of a tuple. Since both variables "num_tuple1" and "num_tuple2" reference the same data, changes to the list elements will reflect in the output of both prints.
Safe Tuple Copying Using copy.deepcopy()
To handle changes to list objects as well, use the copy.deepcopy()
function. copy.deepcopy()
duplicates all data, including tuples.
import copy
num_tuple1 = ([1, 2, 3],)
num_tuple2 = copy.deepcopy(num_tuple1)
num_tuple2[0][0] = 99
print(num_tuple1, type(num_tuple1), id(num_tuple1)) # ([1, 2, 3],) <class 'tuple'> 2289153017312
print(num_tuple2, type(num_tuple2), id(num_tuple2)) # ([99, 2, 3],) <class 'tuple'> 2289153017600
print(num_tuple1[0], type(num_tuple1[0]), id(num_tuple1[0])) # [1, 2, 3] <class 'list'> 2289153063296
print(num_tuple2[0], type(num_tuple2[0]), id(num_tuple2[0])) # [99, 2, 3] <class 'list'> 2289152960704
Checking the output of the above code confirms that all objects have different id numbers, and modifications to the list do not affect the original data.