一个 numpy 数组,把它传给一个函数 fun
搞点操作,涉及改变数组中的值,这些改变会否影响原数组?本文对比两种写法,效果不同,根源是 python 的变量名相当于 C 的指针。python 自带的 list
、pytorch.tensor 也可参考。
本文也简单用到 numba,作为简例。
Code
numba.jit
函数签名当没有返回值时,可写void
。
import numpy as np
import numba as nb
@nb.jit('void(i4[:])')
def fun1(arr):
arr[2] = - arr[2] # change successfully
arr = - arr # change WON'T last
@nb.jit('void(i4[:])')
def fun2(arr):
arr[2] = - arr[2] # change successfully
arr[:] = - arr # change successfully, too
print("fun1")
x = np.arange(7)
print(x, x.dtype)
fun1(x)
print(x)
print("fun2")
y = np.arange(7)
print(y)
fun2(y)
print(y)
输出:
fun1
[0 1 2 3 4 5 6] int32
[ 0 1 -2 3 4 5 6]
fun2
[0 1 2 3 4 5 6]
[ 0 -1 2 -3 -4 -5 -6]
可见,fun1
、fun2
的第一句修改都影响了原数组 x
、y
;但 fun1
的第二句只改了 fun1
内部 arr
的指向,而不影响其原数组 x
,而 fun2
的第二句加了 [:]
,则同第一句一样,能影响原数组 y
。