我不太清楚如何解释这个问题,但让我们看看下面的代码:
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()"?
答案 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_mod
与a_np
是同一个对象。
但是,整数总是按值传递,即复制到函数。
如果您不希望您的功能修改原始阵列,请手动复制:
glb_mod(a_np.copy(), a)