Python 变量在函数中未按预期工作
我试图建立一种数值求导函数。我想构建一个函数来实现这一点,但是我得到了一些以前从未遇到过的异常行为。我将数组Python 变量在函数中未按预期工作,python,python-2.7,function,numpy,variables,Python,Python 2.7,Function,Numpy,Variables,我试图建立一种数值求导函数。我想构建一个函数来实现这一点,但是我得到了一些以前从未遇到过的异常行为。我将数组w传递到我的函数中,并从中定义新变量,比如w\u new。问题是,当我操作w_new时,我也会对w进行更改。为什么会发生这种情况,我该如何解决 以下是我的最低工作示例: import numpy as np eps = 0.05 #doesnt matter i = 0 #doesnt matter weight = np.array([1.0, 2.0, 3.0, 4.0], dtyp
w
传递到我的函数中,并从中定义新变量,比如w\u new
。问题是,当我操作w_new时,我也会对w
进行更改。为什么会发生这种情况,我该如何解决
以下是我的最低工作示例:
import numpy as np
eps = 0.05 #doesnt matter
i = 0 #doesnt matter
weight = np.array([1.0, 2.0, 3.0, 4.0], dtype=float)
def func(eps, w, i):
w_min = w
w_min[i] = w_min[i] - eps
print('w_min:', w_min)
print('w:', w)
w_max = w
w_max[i] = w_max[i] + eps
print('w:', w)
print('w_max:', w_max)
print('w_min', w_min)
return [w_min, w_max, w]
当我在控制台中运行时,我得到
func(eps、wgt、i)
('w_min:',[0.95,1.1,1.2])
('w:',[0.95,1.1,1.2])
('w:',[1.0,1.1,1.2])
('w_max:',[1.0,1.1,1.2])
(‘w_min’,[1.0,1.1,1.2])
这样做的原因是python将通过引用函数来传递任何iterable(或对象实例)。这意味着,如果你有一些函数f(x)直接操纵x,那么你输入f的变量也会被修改
之所以这样做,是因为您可能希望有一个函数f将一个大列表作为输入,但是,在将该列表输入函数之前复制该列表将花费相当多的时间。因此,列表将被发送到函数中,而不会首先被复制
有两种解决方法,第一种(也是最常用的)是不改变f中的x。第二个选项是以这种方式定义函数
from copy import copy
def f(x_list):
x_list = copy(x_list)
# some code that manipulate x_list
最后,我将为一个称为可变默认陷阱的东西添加一个警告,如果您在python中有一个可变默认参数,就会发生这种情况。关于这一点,这里有一个很棒的帖子:谢谢!很难相信我以前没有遇到过这个问题。数组有一个复制方法,
wmin=w.copy()