python函数中的参数传递行为

python函数中的参数传递行为,python,Python,可能重复: 我想通过以下两个函数测试python函数中的参数传递行为: 在: 原来“a”在从f()返回后被修改了 然而,在: import numpy as np def f(a): a=np.array(a,np.float) print 'in f ',a a=[1,2] print 'ori ',a f(a) print 'now ',a 我发现从f()返回后,“a”没有更改为numpy数组 有人能解释一下吗?我经常看到这一点,所以它一定已经得到了回答,

可能重复:

我想通过以下两个函数测试python函数中的参数传递行为:

在:

原来“a”在从f()返回后被修改了

然而,在:

import numpy as np
def f(a):
        a=np.array(a,np.float)
        print 'in f ',a
a=[1,2]
print 'ori ',a
f(a)
print 'now ',a
我发现从f()返回后,“a”没有更改为numpy数组


有人能解释一下吗?

我经常看到这一点,所以它一定已经得到了回答,但这是我的看法

这两条线:

a[0]=3

做一些完全不同的事情。第一个并没有改变
a
是什么——在这一行之后仍然是相同的列表。它通常在列表的索引0处设置一个新对象。我们说它变异了它

第二行将新对象绑定到函数的局部
a
变量。从那时起,函数中的
a
将引用不同的对象。函数外部的
a
是完全独立的,因此它仍然指向列表。两个
a
最初只是引用同一个对象


不能像这样在函数外重新绑定名称。有多种方法可以避免这种情况,其中之一是返回新对象,并让调用方将返回值绑定回自己的
a

我经常看到这种情况,所以它一定已经得到了回答,但我的看法是这样的

这两条线:

a[0]=3

做一些完全不同的事情。第一个并没有改变
a
是什么——在这一行之后仍然是相同的列表。它通常在列表的索引0处设置一个新对象。我们说它变异了它

第二行将新对象绑定到函数的局部
a
变量。从那时起,函数中的
a
将引用不同的对象。函数外部的
a
是完全独立的,因此它仍然指向列表。两个
a
最初只是引用同一个对象


不能像这样在函数外重新绑定名称。有多种方法可以避免这种情况,其中之一是返回新对象,并让调用者将返回值绑定回自己的
a

我相信十几个重复项中的一个可以。哦,您修改了代码。即使是现在,
a
也不会被转换,因为您将函数中的名称
a
指定为一个numpy数组(覆盖旧名称并丢失引用),并且您没有返回它(简而言之,Python使用它),至少没有人对OP投反对票。我想他没有意识到他的立场有多危险。我相信十几个重复的人中有一个可以。哦,你修改了密码。即使是现在,
a
也没有转换,因为您将函数中的名称
a
命名为numpy数组(覆盖旧名称并丢失引用),并且您没有返回它。简而言之,Python使用。好吧,至少没有人对OP投反对票。我想他没有意识到他的立场有多危险。
a=np.array(a,np.float)