生成器和闭包在一起导致了出乎意料的行为
def gen_func1():
def f():
return i
i=0
yield f
i=1
yield f
def gen_func2():
for i in range(2):
def callback():
return i
yield callback
def gen_func3():
def f(i):
def g():
return i
return g
i=0
yield f(i)
i=1
yield f(i)
def gen_func4():
for i in range(2):
def genf(i):
def called():
return i
return called
callback = genf(i)
yield callback
def test(func):
l = []
print(func)
for f in func():
print("first loop:",f())
l.append(f)
for f in l:
print("second loop:",f())
def test1(func):
g = func()
a = next(g)
b = next(g)
print("first loop:",a())
print("first loop:",b())
print("second loop:",a())
print("second loop:",b())
test1(gen_func1) # 1,1,1,1
test(gen_func1) # 0,1,1,1
test(gen_func2) # 0,1,1,1
test(gen_func3) # 0,1,0,1
test(gen_func4) # 0,1,0,1