有人能解释为什么fun1
不修改变量y
的值,而fun2
修改吗?我需要逐行修改数组,但同时更新y
并不是我想要的行为。你知道吗
def fun1(x):
x = 2*x
return x
def fun2(x):
for i in range(0, x.shape[0]):
x[i, :] = 2*x[i, :]
return x
y = np.random.uniform(0, 100, (10, 10))
z1 = fun1(y)
print(np.array(z1 == y).all())
# False
z2 = fun2(y)
print(np.array(z2 == y).all())
# True
修改函数以显示对象的
id
因此
y
引用的数组被传递给函数,并且可以同时被x
(参数变量)和y
(外部变量)引用。但是赋值改变了x
引用—该对象被传递回z
。y
不变。你知道吗使用第二个函数,赋值会更改
x
的元素,但不会更改被引用对象的id
。y
、x
和z
都引用相同的数组。你知道吗如果我们在将
y
传递给函数之前或在函数内部复制它,那么修改x
将不会修改y
。你知道吗我们将数组传递给函数的事实并不会改变对副本的需要。我们会得到同样的行为,即使我们只是在顶级执行的行动。你知道吗
如果对象是列表,则得到相同的行为:
在
fun1
中,执行x = 2*x
将变量x
重新分配给新数组。 在fun2
中,索引赋值x[i, :] = __
直接修改原始数组。你知道吗修改一个对象并保持原稿完整的唯一方法,通常是复制原稿,我认为你在寻找这样的东西:
那么,关于fun1和fun2之间的明显区别的问题的答案是,python与大多数OOP语言一样,是通过对象引用传递的。第一个函数重新分配函数签名中声明的变量,但不改变其输入。第二,简单地改变它的输入。要了解更多信息,请看这篇文章https://robertheaton.com/2014/02/09/pythons-pass-by-object-reference-as-explained-by-philip-k-dick/
相关问题 更多 >
编程相关推荐