A list references a region of memory. When assigned, the list reference itself is copied. In Python we can instead copy elements into a new list.
We sometimes need instead to copy all the elements of a list into a new list. The new list then can be independently modified.
We use the slice syntax to copy a list. When the start and end numbers are omitted, we consider the slice to equal the entire list.
# A list: list1 = [10, 20, 30] # Copy list1 with slice syntax. list2 = list1[:] # Modify list2. list2[0] = 0 print(list1) print(list2)[10, 20, 30] [0, 20, 30]
Next, we use the extend method to copy a list. We first need to allocate a new, empty list. Then we extend that empty list (list2) with the original list.
list1 = [10, 20, 30] # Create empty list, then extend it. list2 = [] list2.extend(list1) # The lists are separate. list2[0] = 0 print(list1) print(list2)[10, 20, 30] [0, 20, 30]
Here we consider performance of list copying. The list contains five numbers. We use while
-loops to repeatedly copy those five elements.
import time list1 = [100, 200, 300, 400, 500] print(time.time()) # Version 1: slice i = 0 while < 10000000: list2 = list1[:] i += 1 print(time.time()) # Version 2: extend i = 0 while i < 10000000: list2 = [] list2.extend(list1) i += 1 print(time.time())1395252155.968703 1395252160.704971 Slice = 4.736 s 1395252166.045275 Extend = 5.340 s
A full-list slice is a good way to copy a list. It requires the least amount of syntax. And it performs faster than the alternative approach that uses the extend method.