When programming mathematical algorithms, it is important to know if unnecessary copying is being done by your program. Copying large matrices is expensive. Consider this simple function, where w could be a matrix or a vector or a list or a string etc.
def twice(w):
"""Replace w by 2*w"""
w *= 2
Consider a scenario where you make an object v and then send it to this function, like in this example:
v = [2, 5, 1]
twice(v)
Task: Your task is to determine if v is being copied when you call twice(v) for some v. In other words, is a deep copy of v being implicitly made by python when you send v as an argument to twice? Answer this for at least two cases:
v is a numpy array v is a stringExplain your observations.