On Fri, Jun 12, 2015 at 9:00 AM, Fabien <fabien.mauss...@gmail.com> wrote: > Folks, > > I am developing a program which I'd like to be python 2 and 3 compatible. I > am still relatively new to python and I use primarily py3 for development. > Every once in a while I use a py2 interpreter to see if my tests pass > through. > > I just spent several hours tracking down a bug which was related to the fact > that zip is an iterator in py3 but not in py2. Of course I did not know > about that difference. I've found the izip() function which should do what I > want
If you're supporting both 2 and 3, you may want to look into using the third-party "six" library, which provides utilities for writing cross-compatible code. Using the correct zip() function with six is just: from six.moves import zip > but that awful bug made me wonder: is it a bad practice to > interactively modify the list you are iterating over? Generally speaking, yes, it's bad practice to add or remove items because this may result in items being visited more than once or not at all. Modifying or replacing items however is usually not an issue. > I am computing mass fluxes along glacier branches ordered by hydrological > order, i.e. branch i is guaranteed to flow in a branch later in that list. > Branches are objects which have a pointer to the object they are flowing > into. > > In pseudo code: > > for stuff, branch in zip(stuffs, branches): > # compute flux > ... > # add to the downstream branch > id_branch = branches.index(branch.flows_to) > branches[id_branch].property.append(stuff_i_computed) Er, I don't see the problem here. The branch object in the zip list and the branch object in branches should be the *same* object, so the downstream branch update should be reflected when you visit it later in the iteration, regardless of whether zip returns a list or an iterator. Tangentially, unless you're using id_branch for something else that isn't shown here, is it really necessary to search the list for the downstream branch when it looks like you already have a reference to it? Could the above simply be replaced with: branch.flows_to.property.append(stuff_i_computed) -- https://mail.python.org/mailman/listinfo/python-list