I tried to store a dictionary template at the beginning of my code that most of the functions will use:
I filled it with all our clients and their users. Then each part of the code can copy this dictionary and produces it's owns outputs. The goal is that each output will have the same "base" dictionary structure like a template where None can be modified.
For each process using this dictionnary I use the following :
process1dict = clientdict
# processing 1
output1dict = ... #modified version of original clientdict, the None values have been replaced by dictionaries/lists
process2dict = clientdict
# processing 2
output2dict = ... #same here but could be different
The problem that I have is that the cliendict changes each time it is copied into a process!
I noticed that because of the None
value in my initial cliendict
it changes after each process (depending on the output of each one of course).
Edit: I found the copy library but copy()
seems to not help my case. I will try out the deepcopy() but why did copy()
didn't worked? And why deepcopy()
will?
When you're working with a mutable collection like a dictionary or a list, and you perform an assignment, you are not creating a copy of that object by default – i.e., the assignment of some dict b
to another dict a
creates a reference from b
to the original object a
, such that when you mutate b
you indirectly also mutate a
.
See this basic example:
>>> orig = {"a": 1, "b": 2}
>>> new = orig
>>> new["a"] = 9
>>> orig
{'a': 9, 'b': 2}
>>> new
{'a': 9, 'b': 2}
>>> new is orig
True
To fix this and keep the new
and orig
dictionaries separate objects that do not reference each other, make a deepcopy of orig
when assigning it to new
:
>>> import copy
>>> orig = {"a": 1, "b": 2}
>>> new = copy.deepcopy(orig)
>>> new["a"] = 9
>>> orig
{'a': 1, 'b': 2}
>>> new
{'a': 9, 'b': 2}
>>> new is orig
False
Also, here's a tl;dr for the Python documentation linked to above:
Assignment statements in Python do not copy objects, they create bindings between a target and an object. For collections that are mutable or contain mutable items, a copy is sometimes needed so one can change one copy without changing the other.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With