生成器惰性机制一窥(1)
先定义一个print
def log(*args,**kwargs):
print(*args,**kwargs)
开始试验:
def fun():
log(111)
yield 222
yield 333
g = fun()
g1 = (i for i in g)
g2 = (i for i in g1)
log(list(g))
log(list(g1))
log(list(g2))
输出结果为:
111
[222,333]
[]
[]
因为g本身为生成器,当g被打印后,生成器的值已经被输出,所以没有值的存在,导致g1和g2为空。
假如g未输出,即把log(list(g)) 注释(#)掉后,g1拥有[222,333],同理,g1注释后,g2拥有[222,333]。
假如在log(list(g))前,先log(g.__next__()),那么,后续只会输出[333]。因为list函数中默认有一个for循环,会把元素全拿走。而next函数只能一次调用一个。
111是用来混淆的,并没有进入生成器。
假如:
g = fun()
g1 = (i for i in g)
gx = fun()
g2 = (i for i in gx)
输出是什么呢?
111
[222, 333]
[]
111
[222, 333]
因为g2生成器的源头改变了~。~

浙公网安备 33010602011771号