Python就地运算符(如"+ ="),numpy数组和身份函数不能正常工作?

0 python numpy in-place operator-keyword

数组yn并且zn等于数字,但有一个奇怪的区别:yn += 7正如预期的那样,行不会改变tn数组,但第二行最后一行会zn += 7改变tn数组!

这是代码:

import numpy as np
def f(x): return (1*x)
def g(x): return (x)
nn = 5
tn = np.zeros(nn)
yn = np.zeros(nn)
zn = np.zeros(nn)

tn = np.linspace(0,1,nn)
yn = f(tn)
zn = g(tn)

print('tn at step1 =',tn)
yn += 7  #as expected, this line does not change tn.
print('tn at step2 =',tn)
zn += 7  #why this line adds 7 to tn array?!
print('tn at step3 =',tn)
Run Code Online (Sandbox Code Playgroud)

输出是:

tn at step1 = [ 0.    0.25  0.5   0.75  1.  ]
tn at step2 = [ 0.    0.25  0.5   0.75  1.  ]
tn at step3 = [ 7.    7.25  7.5   7.75  8.  ] *why is 7 added to tn array?!*
Run Code Online (Sandbox Code Playgroud)

请注意:

  • numpy数组
  • g(x)作为身份函数
  • 就地iadd运算符(+ =)

虽然我一直在使用解决了这个问题zn = zn + 7,而不是zn += 7我的问题是:为什么在倒数第二行zn += 7改变tn阵列?

zon*_*ndo 7

定义时g(),使其返回其参数不变.因此,当你说zn = g(tn),你实际上在说zn = tn.因此,zn现在只是另一个名字tn.该+=操作不是十分的精确复制x = x +.它通常做同样的事情,但在后台它调用一个名为的方法__iadd__.由于zntn现在相同的对象,您所呼叫tn__iadd__方法.因此,tn被修改.要改变它,你可以说zn = tn.copy()你第一次定义它; 或者你可以说zn = zn + 7当你试图添加7.