Python 为什么原始numpy数组在更新其副本后得到更新?

Python 为什么原始numpy数组在更新其副本后得到更新?,python,arrays,numpy,Python,Arrays,Numpy,我对出乎意料的Python行为感到困惑:当我复制原始numpy数组并用不同的值替换其中的一些元素时,原始数组的相应元素也会更新。下面是一个简单的测试: >>import numpy as np >>x = np.array([0,0,2,2]) >>x_adj = x >>x_adj[x_adj <= 0] = 1 >>print x >>print x_adj [1 1 2 2] [1 1 2 2] >将n

我对出乎意料的Python行为感到困惑:当我复制原始numpy数组并用不同的值替换其中的一些元素时,原始数组的相应元素也会更新。下面是一个简单的测试:

>>import numpy as np
>>x = np.array([0,0,2,2])
>>x_adj = x
>>x_adj[x_adj <= 0] = 1
>>print x
>>print x_adj
  [1 1 2 2]
  [1 1 2 2]
>将numpy作为np导入
>>x=np.数组([0,0,2,2])
>>x_adj=x
>>x_adj[x_adj>打印x
>>打印x_调整
[1 1 2 2]
[1 1 2 2]

我想知道,为什么原始数组也会被更新,以及如何保持它的完整性,以便只对副本进行更改。欢迎任何反馈!

赋值在numpy中不是对象的副本。您只是处理对对象的引用,以复制实际使用的数组

x_adj = x.copy()
您可以通过
id
功能轻松检查

>>> import numpy as np
>>> x = np.array([0])
>>> print id(x)
140686120123168
>>> x_adj = x
>>> print id(x_adj)
140686120123168
>>> print id(x.copy())
140685864181632

这是python中的标准行为。副本是对原始文件的引用。在标准python中使用
deepcopy
,或在numpy中使用
.copy
。感谢您的解释!在所有python库(核心、numpy、熊猫)和所有对象(列表、数组、数据帧)中使用“=”时对原始文件的引用也是通用的?我不想夸大其词,但所有基于某个对象的东西和我所知道的东西。这应该是你的默认假设。谢谢,很好的经验法则。谢谢你的反馈!