为何变量‘D8’在第二行代码执行后被意外修改?
问题原因
这是因为numpy数组的赋值是引用传递:当你执行D8 = D7时,并没有生成D7的副本,只是让D8和D7指向内存中同一个数组对象。所以修改D7的内容时,D8作为同一个数组的引用,必然会同步变化。
解决办法
要保存D7的原始值到独立的D8中,需要创建数组的深拷贝,用numpy数组自带的copy()方法即可:
D8 = D7.copy() D7[np.eye(D7.shape[0], D7.shape[1]).astype('bool')] = np.nan
执行这段代码后,D8会是一个完全独立的数组,修改D7的对角线为NaN时,D8会保持初始的数值不变。
额外说明
- 对于numpy数组,直接赋值(
a = b)属于引用传递,两个变量共享同一块内存数据 copy()方法会创建全新的数组对象,数据和原数组完全分离,修改其中一个不会影响另一个- 针对多维数组,
copy()默认是深拷贝,会递归复制所有层级的元素,确保完全独立
内容的提问来源于stack exchange,提问作者George Quinn
相关产品推荐
相关产品推荐

