How to make a completely unshared copy of a complicated list? (Deep copy is not enough)
copy, list, python
Solution
To convert an existing list of lists to one where nothing is shared, you could recursively copy the list.
`deepcopy` will not be sufficient, as it will copy the structure as-is, keeping internal references as references, not copies.
def unshared_copy(inList):
if isinstance(inList, list):
return list( map(unshared_copy, inList) )
return inList
alist = unshared_copy(your_function_returning_lists())
Note that this assumes the data is returned as a list of lists (arbitrarily nested). If the containers are of different types (eg. numpy arrays, dicts, or user classes), you may need to alter this.
Problem
Have a look at this Python code: ``` a = [1, 2, 3] b = [4, 5, 6] c = [[a, b], [b, a]] # [[[1, 2, 3], [4, 5, 6]], [[4, 5, 6], [1, 2, 3]]] c[0][0].append(99) # [[[1, 2, 3, 99], [4, 5, 6]], [[4, 5, 6], [1, 2, 3, 99]]] ``` Notice how modifying one element of `c` modifies that everywhere. That is, if `99` is appended to `c[0][0]`, it is also appended to `c[1][1]`. I am guessing this is because Python is cleverly referring to the same object for `c[0][0]` and `c[1][1]`. (That is their id() is the same.) Question: Is there something that can be done to `c` so that its list elements can be safely locally modified? Above is just an example, my real problem has a list much more complicated, but having a similar problem. (Sorry for the poorly formed question above. Python gurus please feel free to modify the question or tags to better express this query.)