0

I am trying to create a calibration scheduler in Python. To test the program, I just want to be able generate random dates to assign to a "property" of each instrument. For a reason I can't explain, the output clearly indicates that randdays is correctly randomized yet when assigned to the last_calibrated "property", it indicates identical values for all instruments! Why is this and how can I avoid it?

instrument_props = {"last_calibrated": None,
                 "calibration_due": None,
                 "calibration_expired": None,
                 "installed": None,
                 "replaced_by": None}

instruments = {}

start_date = datetime.date(2020, 1, 1)
end_date = datetime.date(2020, 2, 1)
time_between_dates = end_date - start_date
days_between_dates = time_between_dates.days

for instrument in [4167,4958,4959,4960,4961,4962,4963,4964,4965,4966,4967,4968,4969,4970,4971,4972]:
    instruments[instrument] = instrument_props
    randdays = random.randrange(days_between_dates)
    print(randdays)
    instruments[instrument]['last_calibrated'] = start_date + datetime.timedelta(days=randdays)

pp.pprint(instruments)

Here is the output for the above code:

24
25
30
25
0
24
23
9
23
20
16
30
3
20
21
29

{   4167: {   'calibration_due': None,
              'calibration_expired': None,
              'installed': None,
              'last_calibrated': datetime.date(2020, 1, 30),
              'replaced_by': None},
    4958: {   'calibration_due': None,
              'calibration_expired': None,
              'installed': None,
              'last_calibrated': datetime.date(2020, 1, 30),
              'replaced_by': None},
    4959: {   'calibration_due': None,
              'calibration_expired': None,
              'installed': None,
              'last_calibrated': datetime.date(2020, 1, 30),
              'replaced_by': None},
    4960: {   'calibration_due': None,
              'calibration_expired': None,
              'installed': None,
              'last_calibrated': datetime.date(2020, 1, 30),
              'replaced_by': None},
    4961: {   'calibration_due': None,
              'calibration_expired': None,
              'installed': None,
              'last_calibrated': datetime.date(2020, 1, 30),
              'replaced_by': None},
    4962: {   'calibration_due': None,
              'calibration_expired': None,
              'installed': None,
              'last_calibrated': datetime.date(2020, 1, 30),
              'replaced_by': None},
    4963: {   'calibration_due': None,
              'calibration_expired': None,
              'installed': None,
              'last_calibrated': datetime.date(2020, 1, 30),
              'replaced_by': None},
    4964: {   'calibration_due': None,
              'calibration_expired': None,
              'installed': None,
              'last_calibrated': datetime.date(2020, 1, 30),
              'replaced_by': None},
    4965: {   'calibration_due': None,
              'calibration_expired': None,
              'installed': None,
              'last_calibrated': datetime.date(2020, 1, 30),
              'replaced_by': None},
    4966: {   'calibration_due': None,
              'calibration_expired': None,
              'installed': None,
              'last_calibrated': datetime.date(2020, 1, 30),
              'replaced_by': None},
    4967: {   'calibration_due': None,
              'calibration_expired': None,
              'installed': None,
              'last_calibrated': datetime.date(2020, 1, 30),
              'replaced_by': None},
    4968: {   'calibration_due': None,
              'calibration_expired': None,
              'installed': None,
              'last_calibrated': datetime.date(2020, 1, 30),
              'replaced_by': None},
    4969: {   'calibration_due': None,
              'calibration_expired': None,
              'installed': None,
              'last_calibrated': datetime.date(2020, 1, 30),
              'replaced_by': None},
    4970: {   'calibration_due': None,
              'calibration_expired': None,
              'installed': None,
              'last_calibrated': datetime.date(2020, 1, 30),
              'replaced_by': None},
    4971: {   'calibration_due': None,
              'calibration_expired': None,
              'installed': None,
              'last_calibrated': datetime.date(2020, 1, 30),
              'replaced_by': None},
    4972: {   'calibration_due': None,
              'calibration_expired': None,
              'installed': None,
              'last_calibrated': datetime.date(2020, 1, 30),
              'replaced_by': None}}
Sterling Butters
  • 1,024
  • 3
  • 20
  • 41
  • 1
    you assign a reference to the same dict "instrument_props" each time (you see only the date last assigned to 'last_calibrated' in the final result); use `instruments[instrument] = instrument_props.copy()` instead to create a copy. – FObersteiner Aug 23 '21 at 13:58
  • @MrFuppes Wow thank you - you can post as answer for me to accept – Sterling Butters Aug 23 '21 at 14:13
  • 2
    It's basically been answered [here](https://stackoverflow.com/q/2438938/10197418) - it's just sometimes difficult to find the root of an unexpected behavior. Glad I could help with that ;-) – FObersteiner Aug 23 '21 at 14:21

0 Answers0