Arrays python中的函数参数和值更改
我是Python新手。从朋友那里,我知道在Python中,传递给函数的参数类似于C++中的引用调用。但是在使用NumPy进行了一些测试之后,我看到了一些我不容易理解的行为 作为示例,我编写了以下代码Arrays python中的函数参数和值更改,arrays,numpy,Arrays,Numpy,我是Python新手。从朋友那里,我知道在Python中,传递给函数的参数类似于C++中的引用调用。但是在使用NumPy进行了一些测试之后,我看到了一些我不容易理解的行为 作为示例,我编写了以下代码 #!/usr/bin/python import numpy as np def InitArray(x): x = np.arange(0, 5) def ChangeValue(x): x[2] = 4 def main(): x = np.array([1, 2, 3])
#!/usr/bin/python
import numpy as np
def InitArray(x):
x = np.arange(0, 5)
def ChangeValue(x):
x[2] = 4
def main():
x = np.array([1, 2, 3])
print x
InitArray(x)
print x
ChangeValue(x)
print x
if __name__ == "__main__":
main()
我的期望是,在调用InitArray之后,数组“x”应该更改为np.array([0,1,2,3,4])
,但事实并非如此
但是当我调用ChangeValue(x)时,这个值实际上已经改变了。结果如下
[1 2 3]
[1 2 3]
[1 2 4]
我不明白的是,为什么调用InitArray后该值没有变成
[0,1,2,3,4]
?我一直认为它像是通过引用传递的,但Python中的赋值也不像其他语言中的赋值。它只是将引用与对象绑定在一起。但该引用可以从该对象解除绑定并绑定到另一个对象
当您这样做时:
def InitArray(x):
x = np.arange(0, 5)
您正在将局部变量x重新绑定到其他值。但你可以让它变异。让我举一个非numpy的例子:
>>> def foo(x):
... x[3] = 4
... x = [5, 5, 5]
...
>>> x = [0] * 20
>>> x
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
>>> foo(x)
>>> x
[0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
重新绑定运算符类似于在C中更改指针指向的对象。在
ChangeValue
中,您正在内存中的特定点访问x
。而使用InitArray
基本上是在本地范围内销毁x
,并在函数中重新分配它,然后不返回修改后的x
可能重复的