Re: Modify dict/set during iteration?
- From: Steven D'Aprano <steve@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx>
- Date: 30 Oct 2009 03:59:10 GMT
On Thu, 29 Oct 2009 19:02:01 -0700, metal wrote:
I used this quickndirty way, any good idea to solve this problem?
It's not a problem that wants solving, it's a feature that wants paying
attention to.
As a general rule, you shouldn't modify data structures while you're
iterating over them, unless the data structure is advertised as safe to
modify while being iterated over, or you can do so in a way that is
guaranteed to be safe. When it comes to dicts and sets, neither of those
conditions hold.
Why do you want to do this? It seems like a lot of effort to avoid a
simple, straight-forward idiom:
make a copy of the dict or set
iterate over the copy, making changes to the original
What are you trying to accomplish by modifying objects while iterating
over them?
def miter(iterable):[...]
except RuntimeError, e:
# Not sure if there were any other RuntimeError
if 'changed size during iteration' in e.message:
continue
That is not safe. There's no guarantee that the error message won't
change, even between one minor version to another, or between one Python
implementation and another. If you insist on making such an unsafe test,
at the very least be as conservative in what you expect as possible:
if 'changed' in e.message and 'size' in e.message:
and hope that nobody runs your code with internationalised error messages.
--
Steven
.
- Follow-Ups:
- Re: Modify dict/set during iteration?
- From: metal
- Re: Modify dict/set during iteration?
- References:
- Modify dict/set during iteration?
- From: metal
- Modify dict/set during iteration?
- Prev by Date: Re: Feedback wanted on programming introduction (Python in Windows)
- Next by Date: Re: list comprehension problem
- Previous by thread: Re: Modify dict/set during iteration?
- Next by thread: Re: Modify dict/set during iteration?
- Index(es):
Relevant Pages
|