【发布时间】:2018-03-10 22:38:06
【问题描述】:
如果将变量用作函数的参数,则在函数内部使用参数进行的所有修改都将应用于该变量。 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
这同样令人讨厌,需要修改功能。 还有其他想法吗?
【问题讨论】:
-
这应该不足为奇。请阅读this excellent blog post on python variables and values。您似乎缺少的关键点是您正在使用函数参数创建一个新变量,但该新变量引用的是相同的对象。因此,变量不会被修改,对象会被修改。
-
感谢大家的回复。我修改了问题以突出建议的答案之间的区别。
标签: python numpy scientific-computing