Home >Backend Development >Python Tutorial >Why Does `dict.fromkeys()` Create Shared Lists, and How Can I Avoid It?
Fromkeys Caveats: Understanding the Behavior of Dictionary Initialization
In Python, the dict.fromkeys() method is commonly used to create a dictionary with specified keys assigned to empty lists. However, misinterpretation of its behavior has led to unexpected results.
Why fromkeys() Is Tricky
When an empty list [] is provided as the second argument to dict.fromkeys(), all values in the resulting dictionary point to the same list object. This means that any modification to one value affects all values.
Alternative Solutions
To address this issue, the following solutions are recommended:
Use a Dictionary Comprehension:
In Python 2.7 or above, a dictionary comprehension is the most concise and readable solution:
data = {k: [] for k in range(2)}
Use a List Comprehension with dict():
In earlier Python versions, a list comprehension can be passed to the dict() constructor:
data = dict([(k, []) for k in range(2)])
Use a Generator Expression with dict():
In Python 2.4-2.6, a generator expression can be used with dict(), and parentheses can be omitted:
data = dict((k, []) for k in range(2))
Example
The following example illustrates the difference between the default behavior of fromkeys() and the recommended solutions:
# Default behavior of fromkeys() data = {} data = data.fromkeys(range(2), []) data[1].append('hello') print(data) # Output: {0: ['hello'], 1: ['hello']} # Using a dictionary comprehension data = {k: [] for k in range(2)} data[1].append('hello') print(data) # Output: {0: [], 1: ['hello']}
By understanding the nuances of fromkeys(), developers can effectively create dictionaries of empty lists and maintain individual key addressing.
The above is the detailed content of Why Does `dict.fromkeys()` Create Shared Lists, and How Can I Avoid It?. For more information, please follow other related articles on the PHP Chinese website!