在玩發電機時,我發現有趣的事情。當我用yield
關鍵字定義一個函數時,從它接收到一個生成器,我也刪除了序列的變量,該序列被饋送到函數中。而* POOF!* - 發生器變空了。這是我的步驟:從功能發生器的奇怪行爲
>>> def foo(list_):
... for i in list_:
... yield i*2
...
>>> val = [1, 2, 3, 4]
>>> gen = foo(val)
>>> print(tuple(gen))
(2, 4, 6, 8)
>>> del val
>>> print(tuple(gen))
()
>>>
它不應該是不可變的嗎?或者,如果它實際上作爲將其變量的所有值提供給它的函數的對象,給出輸出,爲什麼由於缺少鏈接序列而沒有拋出異常?實際上,這個例子可以解釋爲我迭代了一個空序列,結果for _ in []:
塊永遠不會啓動。但是,我不能解釋爲什麼這沒有拋出異常:
>>> def foo(list_):
... for i in list_:
... yield i*2
...
>>> val = [1, 2, 3, 4]
>>> gen = foo(val)
>>> print(tuple(gen))
(2, 4, 6, 8)
>>> del foo
>>> print(tuple(gen))
()
>>>
發電機正在這裏起到類似dict.get()
功能?我不明白這一點。
事實上,你做了'德爾val'與您觀察到的發電機行爲無關。如果你沒有'del val',你會看到相同的結果。 – user2357112