Strange behavior with iterables - is this a bug?

akameswaran at gmail.com akameswaran at gmail.com
Tue May 30 16:11:26 EDT 2006


Ok, I am confused about this one.  I'm not sure if it's a bug or a
feature.. but

>>> ================================ RESTART
>>> f1 = open('word1.txt')
>>> f2 = open('word2.txt')
>>> f3 = open('word3.txt')
>>> print [(i1.strip(),i2.strip(),i3.strip(),) for i1 in f1 for i2 in f2 for i3 in f3]
[('a', 'a', 'a'), ('a', 'a', 'b'), ('a', 'a', 'c')]
>>> l1 = ['a\n','b\n','c\n']
>>> l2 = ['a\n','b\n','c\n']
>>>
>>> l3 = ['a\n','b\n','c\n']
>>> print [(i1.strip(),i2.strip(),i3.strip(),) for i1 in l1 for i2 in l2 for i3 in l3]
[('a', 'a', 'a'), ('a', 'a', 'b'), ('a', 'a', 'c'), ('a', 'b', 'a'),
('a', 'b', 'b'), ('a', 'b', 'c'), ('a', 'c', 'a'), ('a', 'c', 'b'),
('a', 'c', 'c'), ('b', 'a', 'a'), ('b', 'a', 'b'), ('b', 'a', 'c'),
('b', 'b', 'a'), ('b', 'b', 'b'), ('b', 'b', 'c'), ('b', 'c', 'a'),
('b', 'c', 'b'), ('b', 'c', 'c'), ('c', 'a', 'a'), ('c', 'a', 'b'),
('c', 'a', 'c'), ('c', 'b', 'a'), ('c', 'b', 'b'), ('c', 'b', 'c'),
('c', 'c', 'a'), ('c', 'c', 'b'), ('c', 'c', 'c')]

explanation of code:  the files word1.txt, word2.txt and word3.txt are
all identical conataining the letters a,b and c one letter per line.
The lists I've added the "\n" so that the lists are identical to what
is returned by the file objects.  Just eliminating any possible
differences.


If you notice, when using the file objects I don't get the proper set
of permutations.  I was playing around with doing this via recursion,
etc.  But nothing was working so I made a simplest case nesting.  Still
no go.
Why does this not work with the file objects?  Or any other class I''ve
made which implements __iter__ and next?

Seems like a bug to me, but maybe I am missing something.  Seems to
happen in 2.3 and 2.4.




More information about the Python-list mailing list