[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'