George Sakkis wrote: > "Steven Bethard" wrote: > >>py> def bin(n): >>... s = [] >>... def bin(n): >>... if n == 0: >>... yield s >>... else: >>... s.append(0) >>... for s1 in bin(n - 1): >>... yield s1 >>... s.pop() >>... s.append(1) >>... for s1 in bin(n - 1): >>... yield s1 >>... s.pop() >>... return bin(n) >>... [snip] > A caveat of the implementation above: it yields the same instance (s), > which is unsafe if the loop variable is modified (e.g. in the "for s in > bin(n)" loop, s should not be modified). Moreover, each yielded value > should be 'consumed' and then discarded; attempting to store it (as in > list(bin(n))) references only the last yielded value.
Yup. However, this was the most direct translation of the OP's original function (which also only had a single list). Since the question was about how generators worked, I figured the most direct translation would probably be the most useful response. > Here's a shorter, clear and safe implementation: > > def bin2(n): > if n: > for tail in bin2(n-1): > yield [0] + tail > yield [1] + tail > else: > yield [] This is definitely the way I would have written it. STeVe -- http://mail.python.org/mailman/listinfo/python-list