Значение присвоения переменной Python по сравнению со ссылкой при стохастическом градиентном спуске

#python-3.x #syntax #pass-by-reference #gradient-descent

Вопрос:

Я написал короткую функцию SGD и пытаюсь отслеживать, как SGD обновляет w вектор на каждом шаге. Мысленно я представляю, как этот код изменяет w , а затем вставляет копию нового значения w в список ws , который я использую для отслеживания всех промежуточных значений w . Тем не менее, я понимаю, что Python использует «имена», что означает это переход по ссылке, здесь и так все значения в списке ws в конечном итоге то же, потому что … как я понимаю … я, по сути, передав указатель на тот же объект каждый раз, когда я добавить в список, так что все элементы в конечном итоге совпадает ws[max_iter-1 . Во-первых, я не уверен, как решить эту проблему чисто, но в более широком смысле я чувствую, что это «интуитивная» операция, которая должна иметь некоторую готовую поддержку Python-как другие люди делают такого рода вещи?

 def sgd(X, y, J, dJ, w0, step_size_fn, max_iter):
    w = w0 # init
    print(w)
    fs, ws = [], [] # intermediate values of losses and weights
    d, n = np.shape(X)
    for i in range(max_iter):
        rn = np.random.randint(0, n)
        # gradient descent using dJ at some random data point
        rdp = np.array(X[:, rn:rn 1])
        rl = np.array(y[:, rn:rn 1])
        # add current weights and losses therein
        ws.append(w)
        fs.append(J(rdp, rl, w))
        w -= step_size_fn(i)*dJ(rdp, rl, w)
    return (w, fs, ws)