numpy自我划分的意外行为

blu*_*cat 7 python numpy division

def f(x):
    x=x/5.
    return x
def g(x):
    x/=5.
    return x

x_var = np.arange(5,dtype=np.double)
f(x_var)
print x_var
g(x_var)
print x_var

Output:
[ 0.  1.  2.  3.  4.]
[ 0.   0.2  0.4  0.6  0.8]
Run Code Online (Sandbox Code Playgroud)

这种行为对我来说有点奇怪,我一直以为x/= 5.相当于x = x/5..但很明显,g(x)函数不会使用/ =操作创建新引用.有人可以为此提供解释吗?

shx*_*hx2 6

我一直认为x/= 5.相当于x = x/5

除非班级覆盖__idiv__运营商,否则就是这样numpy.ndarray. numpy.ndarray覆盖它以就地修改数组,这很好,因为它避免了在不需要复制时创建数组的新副本.你可以猜到,它也会覆盖其余的__i*__运营商.

  • 这不是一个numpy问题,它是一个通过引用传递对象的问题.所有`__i*__`的默认实现是尽可能地进行操作,请阅读[docs](http://docs.python.org/reference/datamodel.html#object.__iadd__).将Python列表传递给执行`def f(a)的函数时会遇到同样的问题:a*= 3; 返回一个`,它会修改你调用它的原始对象,而不是简单地返回一个修改后的副本. (5认同)