# a generator that closes over outer variables def f(): x = 1 # closed over by g def g(): yield x yield x + 1 return g() for i in f(): print(i) # a generator that has its variables closed over def f(): x = 1 # closed over by g def g(): return x + 1 yield g() x = 2 yield g() for i in f(): print(i) # using comprehensions, the inner generator closes over y generator_of_generators = (((x, y) for x in range(2)) for y in range(3)) for i in generator_of_generators: for j in i: print(j) # test that printing of closed-over generators doesn't lead to segfaults def genc(): foo = 1 repr(lambda: (yield foo)) genc()