Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python就地运算符(如“x2B=”)、numpy数组和标识函数工作不正常?_Python_Numpy_Operator Keyword_In Place - Fatal编程技术网

Python就地运算符(如“x2B=”)、numpy数组和标识函数工作不正常?

Python就地运算符(如“x2B=”)、numpy数组和标识函数工作不正常?,python,numpy,operator-keyword,in-place,Python,Numpy,Operator Keyword,In Place,数组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) pri

数组
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)
输出为:

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?!*
请注意,所涉及的问题包括:

  • numpy阵列
  • g(x)as恒等式函数
  • 就地iadd运算符(+=)

虽然我用
zn=zn+7
而不是
zn+=7
解决了这个问题,但我的问题是:为什么在最后一行
zn+=7
changes
tn
array?

定义
g()
时,它返回的参数不变。因此,当你说
zn=g(tn)
时,你实际上是在说
zn=tn
。因此,
zn
现在只是
tn
的另一个名称。
+=
运算符与
x=x+
不完全相同。它通常做同样的事情,但是在后台它调用了一个名为
\uuuidd\uuuu
的方法。由于
zn
tn
现在是同一个对象,因此您正在调用
tn
\uu iadd\uu
方法。因此,
tn
被修改。要改变这一点,您可以在第一次定义它时说
zn=tn.copy()
;或者,当您尝试添加7时,您可以说
zn=zn+7

几个编码点。
tn
etc的初始
zero
定义会被后面的赋值覆盖。你不需要它们。在
g
中,
()
没有添加任何内容。使用
返回x
,或按照回答
返回x.copy()
中的建议。