Numpy数组被函数全局修改,没有返回值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Numpy数组被函数全局修改,没有返回值相关的知识,希望对你有一定的参考价值。

当我使用不返回任何东西的函数时,输入参数在全局上保持不变。

例如:

def func(var):
    var += 1

a = 0

for i in range(3):
    func(a)
    print(a)

逻辑上得出

0
0
0

[当输入为numpy数组时,它似乎无法正常工作:

import numpy as np

def func(var):
    var += 1

a = np.zeros(3)  

for i in range(3):
    func(a)
    print(a)

输出:

[1. 1. 1.]
[2. 2. 2.]
[3. 3. 3.]

因此,所有修改都全局地应用于数组,而不是在函数内部。为什么会这样呢?而且,更一般而言,关于如何将np数组作为函数输入进行处理,是否有任何特殊规则?

答案

因为NumPy数组通过引用传递给函数。这意味着将指向该数组的指针发送到该函数,因此函数内部该数组发生的任何事情都将应用于该函数外部定义的变量。]​​>

但是,对于int变量,它是通过copy传递的,这意味着将整数值的副本发送到函数,因此对该值的任何修改都不会影响在函数外部定义的变量。]​​>

在Python中,传递给函数的任何值都是通过引用传递的。因此,在第一种情况下,将数字传递给函数时,会将var设置为对代表数字1的对象的引用。在Python中,偶数是对象。在这种情况下,要增加var意味着要参考代表数字2的对象进行设置。注意,代表数字1的对象未更改。在函数内,将其替换。

另一答案

在Python中,传递给函数的任何值都是通过引用传递的。因此,在第一种情况下,将数字传递给函数时,会将var设置为对代表数字1的对象的引用。在Python中,偶数是对象。在这种情况下,要增加var意味着要参考代表数字2的对象进行设置。注意,代表数字1的对象未更改。在函数内,将其替换。

以上是关于Numpy数组被函数全局修改,没有返回值的主要内容,如果未能解决你的问题,请参考以下文章

乐哥学AI_Python:Numpy索引,切片,常用函数

Numpy | 12 数组操作

java基础3-重载+命令行传参+递归+数组+排序

python numpy.row_stack?想知道怎么修改

Android 逆向函数拦截原理 ( 通过修改 GOT 全局偏移表拦截函数 | 通过在实际被调用的函数中添加跳转代码实现函数拦截 )

返回单元素 Numpy 数组的干净方法