[lang-ref] ( deep_copy ) ( python )
def test_deep_copy():
# copy.deepcopy($items)
import copy
items_original = [['A1', 'B1'], ['A2', 'B2']]
items_shallow1 = list(items_original)
items_shallow2 = copy.copy(items_original)
items_deep = copy.deepcopy(items_original)
assert items_shallow1[0][0] == items_original[0][0]
assert items_shallow1[0][1] == items_original[0][1]
assert items_shallow1[1][0] == items_original[1][0]
assert items_shallow1[1][1] == items_original[1][1]
assert items_shallow2[0][0] == items_original[0][0]
assert items_shallow2[0][1] == items_original[0][1]
assert items_shallow2[1][0] == items_original[1][0]
assert items_shallow2[1][1] == items_original[1][1]
assert items_deep[0][0] == items_original[0][0]
assert items_deep[0][1] == items_original[0][1]
assert items_deep[1][0] == items_original[1][0]
assert items_deep[1][1] == items_original[1][1]
# object is distinct
assert items_shallow1 is not items_original
assert items_shallow2 is not items_original
assert items_deep is not items_original
# top elements are references in shallow copy
assert items_shallow1[0] is items_original[0]
assert items_shallow1[1] is items_original[1]
assert items_shallow2[0] is items_original[0]
assert items_shallow2[1] is items_original[1]
assert items_deep[0] is not items_original[0]
assert items_deep[1] is not items_original[1]
# modify original
items_original[0] = ['A1-mod', 'B1-mod'] # does not affect the copies (rebinds the inner list)
items_original[1][1] = 'B2-mod' # affects shallow copies (mutates a shared inner list)
assert items_shallow1[0][0] == 'A1'
assert items_shallow1[0][1] == 'B1'
assert items_shallow1[1][0] == 'A2'
assert items_shallow1[1][1] == 'B2-mod'
assert items_shallow2[0][0] == 'A1'
assert items_shallow2[0][1] == 'B1'
assert items_shallow2[1][0] == 'A2'
assert items_shallow2[1][1] == 'B2-mod'
assert items_deep[0][0] == 'A1'
assert items_deep[0][1] == 'B1'
assert items_deep[1][0] == 'A2'
assert items_deep[1][1] == 'B2'