As everyone is probably aware by now, in Python 3 dict.keys(), dict.values() and dict.items() will all return iterable views instead of lists. The standard way being suggested to overcome the difference, when the original behavior was actually intended, is to simply use
list(dict.keys()). This should be usually fine, but not in all cases.
One of the reasons why someone might actually opt to perform a more expensive copying operation is because, with the pre-3.0 semantics, the
keys() method is atomic, in the sense that the whole operation of converting all dictionary keys to a list is done while the global interpreter lock is held. Thus, it’s thread-safe to run
dict.keys() with Python 2.X.
The suggested replacement in Python 3,
list(dict.keys()), is not. There’s a chance that the interpreter will give another thread a chance to run before or during the iteration of the view, and this will cause an exception if the dictionary is modified at the same time. To fix the problem, either a lock must protect the iteration, or a more expensive operation such as
dict.copy().keys() must be used.
The 2to3 tool won’t help you there, unfortunately. So, keep an eye on it!