Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays python中的函数参数和值更改_Arrays_Numpy - Fatal编程技术网

Arrays python中的函数参数和值更改

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

我是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]) 
  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

可能重复的