In answering this question, I stumbled across some unexpected behavior:
from typing import List, Iterable
class Name:
def __init__(self, name: str):
self.name = name
def generator(lst: List[Name]) -> Iterable[str]:
lst_copy = lst.copy()
for obj in lst_copy:
yield obj.name
When modifying the list that is passed to the generator, even though a copy is made, changes to the original list are still reflected:
lst = [Name("Tom"), Name("Tommy")]
gen = generator(lst)
lst[0] = Name("Andrea")
for name in gen:
print(name)
Output:
Andrea
Tommy
Simply returning a generator expression works as expected:
def generator(lst: List[Name]) -> Iterable[str]:
return (obj.name for obj in lst.copy())
Output:
Tom
Tommy
Why doesn't the lst.copy() in the first generator function work as expected?