sec02 - tuple Copying
スポンサーリンク

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.

スポンサーリンク