为什么在代码运行后将全局numpy变量传递给函数?

时间:2018-03-14 17:29:44

标签: python numpy

我不太清楚如何解释这个问题,但让我们看看下面的代码:

Name

我有两个名为的全局变量:

import numpy as np

def glb_mod(s_np,s):
    s_np.shape = (2,-1)
    s=2
    return s

if __name__=='__main__':
    a=1
    a_np = np.arange(10)
    print ('a, a_np initialized as')
    print(a , a_np)
    glb_mod(a_np,a)
    print ('a, a_np are now')
    print (a, a_np)

运行函数后

 a, a_np

为什么" a_np"改变但是" a"没变?只是想知道我应该如何修改代码,以便在传递全局变量" a_np"进入功能," a_np"运行后不会改变抛出函数" glb_mod()"?

2 个答案:

答案 0 :(得分:3)

因为s_np是可变的,并且您正在修改s_np

另一方面,

s是不可变的,即使它是可变的,赋值s=2也只会在本地范围内进行更改。

你应该使用

a = glb_mod(a_np,a)

相反,因为您正在返回s

如果您不想更改s_np,则应将副本传递给该功能。

要进行保存,您可以使用

import copy

glb_mod(copy.deepcopy(a_np), a)

答案 1 :(得分:2)

这是因为在Python中,大多数类型的数据都是通过引用传递的,而不是通过 value 传递的。也就是说,该函数获取数据的地址,而不是所述数据的 copy

这很有用,因为它可以节省大量空间,因为每次调用函数时都不会复制大量数据,只需复制地址即可。另一方面,它会导致看似奇怪的事情发生,就像你的情况一样,但你可以在大多数时间利用它。

NumPy数组通过引用传递,这意味着不会复制数组,s_np内的glb_moda_np是同一个对象。

但是,整数总是按值传递,即复制到函数。

如果您不希望您的功能修改原始阵列,请手动复制:

glb_mod(a_np.copy(), a)