微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么 *= 运算符将 numpy 数组更改为超出范围?

如何解决为什么 *= 运算符将 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 举报,一经查实,本站将立刻删除。