Python 为什么在numpy数组上使用*=会修改原始数组?

Python 为什么在numpy数组上使用*=会修改原始数组?,python,numpy,Python,Numpy,下面的代码演示了使用a*=3修改原始数据集,而a=a*3不修改原始数据集: data=np.array([[1,0],[3,4]]) a=data[0] b=data[1] a*=3 b=b*3 print(data) 给出: [[3 0] [3 4]] a*=3语句修改了矩阵数据,但b=b*3语句没有修改。 我预计这两个作业都不会修改数据,因为a和b都被定义为数据片段,因此不应再链接。 这种行为是故意的吗?如果是这样,它背后的逻辑是什么?查看a和b上的标志,特别是OWNDATA标志 >

下面的代码演示了使用
a*=3
修改原始数据集,而
a=a*3
不修改原始数据集:

data=np.array([[1,0],[3,4]])
a=data[0]
b=data[1]
a*=3
b=b*3
print(data)
给出:

[[3 0] [3 4]]
a*=3
语句修改了矩阵数据,但
b=b*3
语句没有修改。 我预计这两个作业都不会修改
数据
,因为
a
b
都被定义为数据片段,因此不应再链接。
这种行为是故意的吗?如果是这样,它背后的逻辑是什么?

查看
a
b
上的标志,特别是OWNDATA标志

>>> a.flags
  C_CONTIGUOUS : True
  F_CONTIGUOUS : True
  OWNDATA : False   # <--- a does not copy data (a*=3 mutates original data)
  WRITEABLE : True
  ALIGNED : True
  WRITEBACKIFCOPY : False
  UPDATEIFCOPY : False
>>> b.flags
  C_CONTIGUOUS : True
  F_CONTIGUOUS : True
  OWNDATA : True   # <--- b is copied (the multiplication b*3 creates the copy)
  WRITEABLE : True
  ALIGNED : True
  WRITEBACKIFCOPY : False
  UPDATEIFCOPY : False
>a.flags
C_:对
F_:对
OWNDATA:False#>>b.flags
C_:对
F_:对

OWNDATA:True#查看
a
b
上的标志,特别是OWNDATA标志

>>> a.flags
  C_CONTIGUOUS : True
  F_CONTIGUOUS : True
  OWNDATA : False   # <--- a does not copy data (a*=3 mutates original data)
  WRITEABLE : True
  ALIGNED : True
  WRITEBACKIFCOPY : False
  UPDATEIFCOPY : False
>>> b.flags
  C_CONTIGUOUS : True
  F_CONTIGUOUS : True
  OWNDATA : True   # <--- b is copied (the multiplication b*3 creates the copy)
  WRITEABLE : True
  ALIGNED : True
  WRITEBACKIFCOPY : False
  UPDATEIFCOPY : False
>a.flags
C_:对
F_:对
OWNDATA:False#>>b.flags
C_:对
F_:对

OWNDATA:True#我认为这并不特定于numpy,而是适用于任何可变对象。例如,请参见以下修改列表(原型可变对象)的代码:


因此,赋值将创建一个副本,而操作符(+=)将修改对象。numpy对象只是以同样的方式工作。

我认为这不是特定于numpy的,而是适用于任何可变对象。例如,请参见以下修改列表(原型可变对象)的代码:

因此,赋值将创建一个副本,而操作符(+=)将修改对象。numpy对象的行为方式完全相同