Python函数调用后原numpy数组变量值改变的原因咨询
为什么传入函数的numpy数组x被修改了?
核心原因:Python的参数传递规则
Python采用传对象引用的方式传递参数:
- 当你把numpy数组
x传入model函数时,参数aux并不是x的副本,而是指向同一个数组对象的引用。 - numpy数组属于可变对象,如果在函数内部直接修改对象的元素(比如
aux[i] = ...),本质上是修改了内存中同一个数组的内容,所以原变量x的值也会跟着改变。 - 你熟悉的Fortran、Matlab默认会对输入参数做复制(传值语义),C/C++默认也是传值,所以原变量不会被函数内的操作修改,这就是你没遇到过这种情况的原因。
另外,你的函数最后返回aux,而aux和x指向同一个对象,所以output和x自然完全相同。
解决方法:避免修改原数组
有几种方式可以保证原数组x不被修改:
1. 在函数内部创建数组副本
修改model函数,先复制输入数组,再修改副本:
import numpy as np def model(aux): # 创建输入数组的副本 aux_copy = aux.copy() for i in range(len(aux_copy)): aux_copy[i] = np.sin(aux_copy[i]) + 1 return aux_copy length = 5 x = np.linspace(0,1,length) print('X variable BEFORE the function call') print(x) output = model(x) print('X variable AFTER the function call') print(x) print('Output variable AFTER the function call') print(output)
2. 调用函数时传入数组副本
不需要修改函数,调用时传入x的副本:
output = model(x.copy())
3. 使用numpy向量化操作(更简洁高效)
numpy的向量化操作会返回新数组,不会修改原数组,同时还能去掉循环:
import numpy as np def model(aux): return np.sin(aux) + 1 length = 5 x = np.linspace(0,1,length) print('X variable BEFORE the function call') print(x) output = model(x) print('X variable AFTER the function call') print(x) print('Output variable AFTER the function call') print(output)
以上三种方式运行后,x都会保持调用前的原始值,output是独立的新数组。
内容的提问来源于stack exchange,提问作者Andrey Vlasenko
相关产品推荐
相关产品推荐

