def mediumcopy(value):
    return dict((key, copy.copy(val)) for key, val in value.items())
z = {'a': [[1], [2]]}
zcopy = mediumcopy(z)
assert id(z) != id(zcopy)
assert id(z['a']) != id(zcopy['a'])
assert id(z['a'][0]) == id(zcopy['a'][0])
Is there such a thing as a "medium"-copy? Or: how to finely control "depth" of copy?