I had a requirement in one of my codes to access values from a list of dictionaries that I initialized with default values. My object looked like this:
>>> lengths = [{"max_len":0,"eq_len":True}] * 7
>>> print(lengths)
[{'max_len': 0, 'eq_len': True}, {'max_len': 0, 'eq_len': True}, {'max_len': 0, 'eq_len': True}, {'max_len': 0, 'eq_len': True}, {'max_len': 0, 'eq_len': True}, {'max_len': 0, 'eq_len': True}, {'max_len': 0, 'eq_len': True}]
Surprisingly, when I'm trying to update any one of the values in this lengths object directly, all the other objects are also getting updated. For ex:
>>> col_lengths[0]["max_len"] = 10
>>> print(col_lengths)
[{'max_len': 10, 'eq_len': True}, {'max_len': 10, 'eq_len': True}, {'max_len': 10, 'eq_len': True}, {'max_len': 10, 'eq_len': True}, {'max_len': 10, 'eq_len': True}, {'max_len': 10, 'eq_len': True}, {'max_len': 10, 'eq_len': True}]
>>> col_lengths[4]["eq_len"] = False
>>> print(col_lengths)
[{'max_len': 10, 'eq_len': False}, {'max_len': 10, 'eq_len': False}, {'max_len': 10, 'eq_len': False}, {'max_len': 10, 'eq_len': False}, {'max_len': 10, 'eq_len': False}, {'max_len': 10, 'eq_len': False}, {'max_len': 10, 'eq_len': False}]
Looks like this behavior is unexpected. Or am I doing something wrong? Can someone please help me with this?