我有两个具有相同键的字典。每个项目是一个ndarray。Python:修改包含数组视图的单个字典项目修改所有项目
from numpy import zeros, random
from collections import namedtuple
PhaseAmplitude = namedtuple('PhaseAmplitude','phase amplitude')
dict_keys = {'K1','K2', 'K3'}
J1 = dict.fromkeys(dict_keys, zeros((2,2,2,2)))
U1 = dict.fromkeys(dict_keys, PhaseAmplitude(phase = zeros((2,2)),
amplitude = zeros((2,2))))
for iFld in dict_keys:
U1[iFld] = U1[iFld]._replace(phase = random.random_sample((2,2)),
amplitude = random.random_sample((2,2)))
我想用在第二个相应的项目来修改第一库的每个项目:
for iFld in dict_keys:
J1[iFld][0,0,:,:] += U1[iFld].phase
J1[iFld][0,1,:,:] += U1[iFld].amplitude
我期望得到的是J1[iFld][0,0,:,:] = U1[iFld].phase
和J1[iFld][0,1,:,:] = U1[iFld].amplitude
但我得到J1[iFld]
是相同的全部为iFld
并且等于U1
的所有iFld
键的总和(当然保持跟踪phase
和amplitude
字段的U1
)。
对我来说这看起来像一个错误,但我一直只使用Python一个月左右(从matlab切换),所以我不确定。
问题:这是预期的行为还是错误?为了获得我想要的行为,我应该在代码中更改哪些内容?
注:我选择的dict_keys
,J1
和U1
维数,以反映我的特殊情况。
Python字典值就像指针,我猜所有的键都指向同一个对象。你可以使用内建'id'函数或'is'运算符来检查它们是否是同一个对象。如果是这种情况,请使用'dict.copy'方法。 –