C-Sharp | Java | Python | Swift | GO | WPF | Ruby | Scala | F# | JavaScript | SQL | PHP | Angular | HTML
When assigned, the list reference itself is copied. We sometimes need instead to copy all the elements of a list into a new list. The new list then can be independently modified.
Based on: Python 3
Example. We use the slice syntax to copy a list. With slices, we separate two numbers with a colon. But when those numbers are omitted, we consider the slice to equal the entire list. So an unspecified slice copies a list.
Tip: This is the shortest syntax form. It requires only a list reference and three characters.
Python program that copies list # A list: list1 = [10, 20, 30] # Copy list1 with slice syntax. list2 = list1[:] # Modify list2. list2[0] = 0 print(list1) print(list2) Output [10, 20, 30] [0, 20, 30]
Extend. 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. Extend receives a sequence type.
Note: This approach requires two lines. It is also less efficient. Please see the benchmark section.
Python program that uses extend, copies 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) Output [10, 20, 30] [0, 20, 30]
Performance. Here we consider performance of list copying. Version 1 tests the slice syntax. Version 2 instead uses the extend method (after creating an empty list). We repeat these operations ten million times.
List: The list contains five numbers. We use while-loops to repeatedly copy those five elements.
Result: Taking a slice to copy a list is faster. It required just 4.7 seconds, versus 5.3 for the extend method version.
Python program that times list copying import time list1 = [100, 200, 300, 400, 500] print(time.time()) # Version 1: slice i = 0 while i < 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()) Output 1395252155.968703 1395252160.704971 Slice = 4.736 s 1395252166.045275 Extend = 5.340 s
Summary. 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. Slicing wins on both considerations.