Copy a list of list by value and not reference
本问题已经有最佳答案,请猛点这里访问。
为了理解为什么我在一个程序中得到了一个错误,在这个程序中我试图找到一个行列式的"小"项,我写了一个更简单的程序,因为我的变量是混乱的。下面的函数接受一个2*2矩阵作为输入,并返回一个包含其行的列表(我知道,这是无意义的、低效的,但我试图理解其背后的理论)。
1 2 3 4 5 6 7 8 9 | def alpha(A): #where A will be a 2 * 2 matrix B = A #the only purpose of B is to store the initial value of A, to retrieve it later mylist = [] for i in range(2): for j in range(2): del A[i][j] array.append(A) A = B return mylist |
然而,在这里,似乎b是动态地分配a的值的,从某种意义上说,我不能将a的初始值存储在b中以供以后使用。为什么会这样?
因为python通过引用传递列表这意味着当你写"b=a"的时候,你会说a和b是同一个物体,当你改变b的时候,你也会改变a,和viceversa。
按值复制列表的方法:
1 | new_list = old_list[:] |
如果列表中包含对象,并且您也希望复制它们,请使用generic copy.deepcopy():
1 2 | import copy new_list = copy.deepcopy(old_list) |
由于python通过引用传递list,所以
1 2 3 4 5 6 7 8 9 10 11 | >>> A = [1, 2, 3] >>> def change(l): ... b = l ... b.append(4) ... >>> A [1, 2, 3] >>> change(A) >>> A [1, 2, 3, 4] >>> |
如果需要
a看起来像引用类型,而不是值类型。引用类型不会在分配时复制(与R不同)。可以使用copy.copy对元素进行深度复制