Creating a nested dictionary in a for loop

Viewed 383

I'm trying to create a nested dictionary and don't understand the output I'm getting.

The code I've run is:

import numpy as np

io_dict = dict.fromkeys(['a', 'b'])
channel_dict = dict.fromkeys(['ch1', 'ch2'])

io_dict['a'] = channel_dict
io_dict['b'] = channel_dict
for channel in channel_dict.keys():
    io_dict['a'][channel] = np.array([1,2,3])
    io_dict['b'][channel] = np.array([5,6,7])
io_dict

This produces the output:

{'a': {'ch1': array([5, 6, 7]), 'ch2': array([5, 6, 7])},
 'b': {'ch1': array([5, 6, 7]), 'ch2': array([5, 6, 7])}}

However, I was expecting:

{'a': {'ch1': array([1, 2, 3]), 'ch2': array([1, 2, 3])},
 'b': {'ch1': array([5, 6, 7]), 'ch2': array([5, 6, 7])}}

Any help would be greatly appreciated.

1 Answers

Both of your dictionaries which are io_dict['a'] and io_dict['b'] are from same dictionary, so when ever you are updating the above two dictionaries, its updating the same from the back end so you are getting such kind of error. Going to view of compiler, as you have assigned channel_dict to both io_dict['a'] and io_dict['b'], so these two works as a shortcut that refers to the same memory location and when ever you are updating one then both gets updated.

But if we will use io_dict['a'] = channel_dict.copy() and io_dict['b'] = channel_dict.copy() instead, then the compiler will take different memory location for both of your dictionaries which will fulfill your requirment.

Your completed code will be,

import numpy as np

io_dict = dict.fromkeys(['a', 'b'])
channel_dict = dict.fromkeys(['ch1', 'ch2'])

io_dict['a'] = channel_dict.copy()
io_dict['b'] = channel_dict.copy()
for channel in channel_dict.keys():
    io_dict['a'][channel] = np.array([1,2,3])
    io_dict['b'][channel] = np.array([5,6,7])
print(io_dict)
Related