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()