How to force a shallow copy? If I do this in a script

v = bpy.data.objects['Cube'].data.vertices[0].co


v becomes a deep copy of that vector, this is a behaviour that is common to many other places inside the Python APIs.

The irony is that in Python the method copy returns a shallow copy, and deepcopy returns a ... deepcopy; in Blender it looks like there is no real rationale for what you get, apparently everything is tuned for deep copies, but when an object has the copy method, it returns a deepcopy and not the standard python-esque shallow copy, and the method deepcopy is pretty much absent .

Inside loops you tend to get shallow copies because of Python optimizations, but speaking about the API in general, how I can enforce the use of shallow copies ?
First sentence from the link provided in the question:


  Assignment statements in Python do not copy objects, they create bindings between a target and an object


You assign / bind the mathutils.Vector object stored in the attribute co to the variable / name v. 

You don't copy anything. 

Use co.copy() to get a new instance of the vector and assign it to v instead.

Most vector operations and methods like +, -, *, cross, dot will also return a new instance for the result. So if you plan to use some of these maybe you don't need .copy.

This is done behind the scenes for immutable objects like strings or tuples. As soon as you make a change to a tuple or a string you get a new instance.

But if the object is mutable like a list it works the same way:

a = [1, 2, 3]
b = a
b[0] = 4
a[0] #-&gt; 4