Dictionary .keys() and .values() should return a set [withPython3000 in mind]
Delaney, Timothy (Tim)
tdelaney at avaya.com
Mon Jul 3 01:00:37 EDT 2006
Paul Rubin wrote:
> "Delaney, Timothy (Tim)" <tdelaney at avaya.com> writes:
>> The eventual consensus was that keys(), etc should return views on
>> the dictionary. These views would be re-iterable and will have
>> basically the same behaviour as the lists returned from keys(), etc.
>> However, such a view could have O(1) __contains__ behaviour, and
>> would not incur the overhead of creating a list and populating it -
>> they would be backed by the dictionary. Of course, this introduces
>> the issue of concurrent modification, but you can always get an
>> independent copy by calling list(dict.keys()).
>
> Wait a sec, you're saying
>
> k0 = d.keys()
> d['whee'] = 'parrot' # this can change k0???
>
> That sounds broken.
That's the problem with views. You either take a snapshot of the current
state, or you deal with the backing store changing. Java's solution is
to raise a ConcurrentModificationException when it determines this has
happened (with lots of weasel words about no guarantees).
If you want an independent data set, you have to take a snapshot. For
the above, that's doing:
k0 = list(d.keys())
or
k0 = set(d.keys())
depending on what behaviour you want.
Tim Delaney
More information about the Python-list
mailing list