我有一个叫做import datetime
date_tuple = datetime.datetime(*xlrd.xldate_as_tuple(date, r_file.datemode))
的numpy数组,在循环的每一步中都是for循环我想随机改变那个数组的一个索引(每次都是一个不同的)和我的矩阵的过程。
initial_matrix
函数replace_index,随机地使用值重新获得matreix的一个索引。我注意到替换的结果不仅发生在init_matrix = deepcopy(my_matrix)
for i in range(0, 30):
new_mat, rep_index = replace_index(my_matrix, value)
...// proceed with my process
,也发生在new_mat
。但是,我想在循环的每个步骤中使用我的初始矩阵而不是更换数组后的矩阵。我怎么能这样做?
答案 0 :(得分:1)
在replace_index()中制作my_matrix的副本并使用副本。
答案 1 :(得分:1)
如果您不想修改当前功能(my_matrix, value)
,可以通过以下方式将副本传递给此功能:
new_mat, rep_index = replace_index(my_matrix.copy(), value)
简短说明:
这个问题通常发生在python中,每当你将一个mutable传递给一个函数时。 Mutables ,如np.ndarray
,list
或dict
将通过引用传递给函数。这意味着只要不重新引用引用,就可以在外部作用域中看到对它们执行的所有操作。重新绑定操作通常是更改对象的内存地址的操作,如附加,连接,复制,只需用新对象覆盖等。
对于数组a = np.zeros(3)
,类似a = [1., 2., 3.]
的操作会重新引用引用(新类型显然会是list
),而a[:] = [1., 2., 3.]
则不会,因为a[:] =
访问用于分配值的底层内存范围,而a = ...
确实重新绑定了a
的引用。