python修改用作函数参数的变量。如何正确预防?

时间:2018-03-10 22:38:06

标签: python numpy scientific-computing

如果变量用作函数的参数,则使用参数在函数内部完成的所有修改都将应用于变量。 This is normal and expected,但在许多情况下是不受欢迎的。防止这种行为的最佳做法是什么?例如:

import numpy as np
def func(A):
    for ind in range(A.shape[0]):  
        A[ind] = A[ind]+1
    return A

A = np.array([1, 2, 3])
NewA = func(A)
print(A)
print(NewA)
Out: [2, 3, 4]
Out: [2, 3, 4]

虽然我们想要:

Out: [1, 2, 3]
Out: [2, 3, 4]

到目前为止,我只提出了两个想法。

方法一:显然,传递一个变量的副本:

A = np.array([1, 2, 3])
NewA = func(A.copy())
print(A)
print(NewA)
Out: [1, 2, 3]
Out: [2, 3, 4]

返回预期但当一个函数有5个参数时变得非常烦人:每次输入.copy()都太长了。

方法二: 修改函数体

def func(A):
    B = A.copy()
    for ind in range(B.shape[0]):  
        B[ind] = B[ind]+1
    return B

这同样令人烦恼,需要修改功能。 还有其他想法吗?

1 个答案:

答案 0 :(得分:-2)

这是由于参数的类型。如果参数是不可变对象,例如intstring,则它的作用类似于按值调用。如果它是一个可变对象,例如np.darray,它的作用类似于引用调用。