关于python:按值复制列表,而不是引用

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,所以AB是相同的对象。当您修改B时,您也在修改A。这个行为可以用一个简单的例子来演示:

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的副本,请使用slice表示法:

B = A[:]


a看起来像引用类型,而不是值类型。引用类型不会在分配时复制(与R不同)。可以使用copy.copy对元素进行深度复制