1

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?

control-zed
  • 45
  • 1
  • 12
  • It seems like when you create the list of dictionaries using *7, you are having them reference the same object. Try looping through a list and append it n number of times. That should help in creating a unique object instead of reusing the same object in the list. – mindless-overflow Jan 18 '20 at 21:41
  • Assigning by looping n times has resolved this issue. – control-zed Feb 05 '20 at 11:30

0 Answers0