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) # [
When you want a copy, you explicitly make a copy - the cryptical [:]
"slice it all" form is idiomatic, but my favorite is the much-more-readable approach of explicitly calling list
.
If c
is constructed in the wrong way (with references instead of shallow copies to lists you want to be able to modify independently) the best thing would be to fix the way it's built (why build it wrong and then labor to fix it?!), but if that's outside your control it IS possible to undo the damage -- just loop on c
(recursively if needed), with an index, reassigning the relevant sublists to their copies. For example, if you know for sure that c
's structure is two-level as you indicate, you can save yourself without recursion:
def fixthewronglymadelist(c):
for topsublist in c:
for i, L in enumerate(topsublist):
topsublist[i] = list(L)
Despite what other answers suggest, copy.deepcopy
would be hard to bend to this peculiar purpose, if all you're given is the wrongly made c
: doing just copy.deepcopy(c)
would carefully replicate whatever c's topology is, including multiple references to the same sublists! :-)