Skip to main content
 首页 » 编程设计

python之函数参数的可变性

2025年05月04日13freeliver54

我猜函数参数不会改变原始变量。例如

x=10 
 
def mycal(someval): 
    someval = someval * 2 
    return someval 

如果我调用该函数,它将返回 20:

mycal(x) 
20 

但是x的值还是10:

x 
10 

为什么当我运行这段代码时 theta 值变成了 3.7 和 3.2?

import numpy as np 
 
X = 2 * np.random.rand(100,1) 
y = 4 +3 * X+np.random.randn(100,1) 
 
def predict_func(slope,intercept,x_test): 
    pred = ((np.dot(x_test, slope)) + intercept)         
    return pred 
 
def mse_calc(prediction, y_test): 
    error = np.mean((prediction - y_test)**2) 
    return error 
 
def grad_descent(s_theta, l_rate, tolerance, iter_val, x_train, y_train): 
 
    n_data = len(x_train) 
    bias = np.ones((n_data,1)) 
    s_intercept = s_theta[0] 
    s_slope = s_theta[1:] 
    prediction = predict_func(s_slope, s_intercept, x_train) 
    error =  mse_calc(prediction, y_train) 
    x_train_b = np.append(bias, x_train, axis = 1)  
 
    for i in range(iter_val): 
        int_theta = [0 for i in range(len(x_train[0]) + 1)] 
        n_pt = float(len(x_train)) 
 
        prediction = predict_func(s_slope, s_intercept, x_train) 
 
        int_theta = 2 / n_pt * np.dot(x_train_b.T, (prediction - y_train))        
        s_theta -=  l_rate * int_theta 
 
    s_intercept = s_theta[0] 
    s_slope = s_theta[1:] 
    prediction = predict_func(s_slope, s_intercept, x_train) 
    final_error = mse_calc(prediction, y_train) 
 
    return  s_theta, final_error 
 
 
theta = np.zeros((len(X[0]) + 1, 1)) 
tolerance = 0.0001 
l_rate = 0.01 
iterations = 5000 
 
print (theta) 
 
grad_theta, grad_error  = grad_descent(theta, l_rate, tolerance, iterations, X, y) 
 
print (theta) 

我希望 theta 值仍然为 0 而 grad_theta 应该是 3.7


在下面的示例中,第一个是重新定义变量,而接下来的两个是指针并附加可变对象。

some_list = some_list + [2] 
some_list.append(2) 
some_list += [2] 

+= 关闭选项 2 而不是我预期的选项 1。

+= 和 -= 到底是什么?

请您参考如下方法:

someval = someval * 2 

这重新定义了 someval。重新定义后 x 和 someval 不再引用同一个对象,因此这不会修改 x。

s_theta -=  l_rate * int_theta 

这会改变 s_theta,不会重新定义它,因此这也会影响 theta 的值,因为 s_theta 和 theta 仍然引用同一个对象。