Strange generator problem
Paul Hankin
paul.hankin at gmail.com
Fri Oct 5 05:34:53 EDT 2007
On Oct 5, 10:23 am, Joost Cassee <jo... at cassee.net> wrote:
> Hello all,
>
> I bumped into an unexpected problem using generators. Consider this code:
>
> def test(s):
> return _test([], [], s)
> def _test(s1, s2, s):
> if s:
> s1.append(s.pop())
> for x in _test(s1, s2, s):
> yield x
> s2.append(s1.pop())
> for x in _test(s1, s2, s):
> yield x
> s.append(s2.pop())
> else:
> yield s1, s2
Lists aren't copied when they're yielded, so you're returning the same
lists (with different elements) each time. Your final list looks like
[(s1, s2), (s1, s2), ...] and as it happens, s1 and s2 are both [] by
the end.
You can fix it by copying the lists manually before yielding them, or
using a better sub-list algorithm :)
--
Paul Hankin
More information about the Python-list
mailing list