I am trying to understand the behavior of iterators in Python, particularly when using the copy.copy()
and copy.deepcopy()
functions. I have the following script:
import copy
my_list = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"]
def iterate_5_elements(iterator):
for _ in range(5):
print(next(iterator))
my_iterator1 = enumerate(my_list)
iterate_5_elements(my_iterator1)
iterate_5_elements(my_iterator1)
print("--------------------------------")
my_iterator2 = enumerate(my_list)
iterate_5_elements(copy.copy(my_iterator2))
iterate_5_elements(copy.copy(my_iterator2))
print("--------------------------------")
my_iterator3 = enumerate(my_list)
iterate_5_elements(copy.deepcopy(my_iterator3))
iterate_5_elements(copy.deepcopy(my_iterator3))
print("--------------------------------")
And it produces this output:
(0, 'a')
(1, 'b')
(2, 'c')
(3, 'd')
(4, 'e')
(5, 'f')
(6, 'g')
(7, 'h')
(8, 'i')
(9, 'j')
--------------------------------
(0, 'a')
(1, 'b')
(2, 'c')
(3, 'd')
(4, 'e')
(0, 'f')
(1, 'g')
(2, 'h')
(3, 'i')
(4, 'j')
--------------------------------
(0, 'a')
(1, 'b')
(2, 'c')
(3, 'd')
(4, 'e')
(0, 'a')
(1, 'b')
(2, 'c')
(3, 'd')
(4, 'e')
--------------------------------
The first and third iterator behave as expected. However, with the second iterator (using copy.copy()
), the output is strange: The letters continue from 'f' instead of starting from 'a' (expected behavior, its a shallow copy) but the numbers reset.
Why does this happen? Why does the alphabet continues from 'f' after the first iteration, even though the index seems to reset?
I was expecting the shallow copy to behave exactly like the first iterator, I.E. printing 0 through 9 and 'a' through 'f'