Modify dict/set during iteration?
metal29a at gmail.com
Fri Oct 30 05:14:22 CET 2009
On 10月30日, 上午11时59分, Steven D'Aprano <st... at REMOVE-THIS-
> 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.
Yes the idoim rulz. I confused my self.
Maybe my real goal is the following:
for x in tuple(iterable):
if x in iterable:
More information about the Python-list