Python中多变量赋值numpy数组后值异常覆盖问题求解
问题:多个变量赋值numpy数组后,最后一次赋值覆盖所有变量值
我尝试给不同变量赋值numpy数组,但最后一次赋值会覆盖所有变量对应位置的值,简化后的代码如下:
import numpy as np metric_a = metric_b = metric_c = metric_d= np.zeros(10) j = 0 temp_a = 1 temp_b = 2 temp_c = 1 temp_d = 5 print('temp_a=', temp_a, ' temp_b=', temp_b, ' temp_c=', temp_c, ' temp_d=', temp_d) print('metric_a['+str(j)+']=', metric_a[j], ' metric_b['+str(j)+']=', metric_b[j], ' metric_c['+str(j)+']=',metric_c[j], ' metric_d['+str(j)+']=',metric_d[j]) print('j:',j, '\n') metric_a[j] = temp_a metric_b[j] = temp_b metric_c[j] = temp_c metric_d[j] = temp_d print('temp_a=', temp_a, ' temp_b=', temp_b, ' temp_c=', temp_c, ' temp_d=', temp_d) print('metric_a['+str(j)+']=', metric_a[j], ' metric_b['+str(j)+']=', metric_b[j], ' metric_c['+str(j)+']=',metric_c[j], ' metric_d['+str(j)+']=',metric_d[j])
实际输出:
temp_a= 1 temp_b= 2 temp_c= 1 temp_d= 5 metric_a[0]= 0.0 metric_b[0]= 0.0 metric_c[0]= 0.0 metric_d[0]= 0.0 j: 0 temp_a= 1 temp_b= 2 temp_c= 1 temp_d= 5 metric_a[0]= 5.0 metric_b[0]= 5.0 metric_c[0]= 5.0 metric_d[0]= 5.0
期望输出:
metric_a[0]= 1.0 metric_b[0]= 2.0 metric_c[0]= 1.0 metric_d[0]= 5.0
原因与解决方法
原因分析
你用metric_a = metric_b = metric_c = metric_d= np.zeros(10)这种链式赋值时,并没有创建四个独立的numpy数组。实际上这四个变量都指向同一个数组对象——numpy数组属于可变对象,所有变量共享同一块内存空间的数组数据。所以不管你通过哪个变量修改数组元素,所有变量都会同步看到修改后的结果,最后一次赋值自然会覆盖掉之前的修改。
解决方法
要让每个变量对应独立的数组,有两种常用方式:
分别创建数组
直接逐个调用np.zeros(10)生成独立数组:import numpy as np metric_a = np.zeros(10) metric_b = np.zeros(10) metric_c = np.zeros(10) metric_d = np.zeros(10)使用
copy()复制数组
先创建一个基础数组,再通过copy()方法生成独立副本:import numpy as np base_array = np.zeros(10) metric_a = base_array.copy() metric_b = base_array.copy() metric_c = base_array.copy() metric_d = base_array.copy()
内容的提问来源于stack exchange,提问作者deijany91
相关产品推荐
相关产品推荐

