如何解决为什么 *= 运算符将 numpy 数组更改为超出范围?
我刚刚遇到了 Python 中 numpy 数组的 *= 运算符的这种奇怪行为(至少对我而言)。如果我传递一个局部变量 (ndarray),让我们将它称为 x,到一个函数,然后修改 x,例如通过 x*= 2,此更改将传播到我调用该函数的作用域。如果我这样做但使用 x = x*2 我看不到这种行为。这是为什么?我期待 x*=2 和 x=x*2 是相同的。我仅针对 numpy 数组观察到这一点。感谢您的帮助,我还附上了示例代码。
import numpy as np
def my_func1(x_func):
x_func *= 2
return None
def my_func2(x_func):
x_func = x_func * 2
return None
def my_func():
x = np.array([1]) # expect x to keep this value in the scope of my_func
my_func2(x)
print(x) # x still [1]
my_func1(x)
print(x) # x changed to [2]!
my_func()
Out:
[1]
[2]
解决方法
某些操作,例如 += 和 *=,会修改现有数组而不是创建新数组。这就是为什么当第一个函数被调用时,主函数中的数组被修改了。
def my_func1(x_func):
x_func *= 2
return None
修改后的第二个函数没有返回新数组(x_func = x_func * 2),是一个简单的赋值操作。
def my_func2(x_func):
x_func = x_func * 2
return None
所以它的值没有在主函数(my_func())中被修改。
参考:https://numpy.org/doc/stable/user/quickstart.html#basic-operations
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。