How to force a shallow copy?
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