按值复制列表列表,而不是引用

时间:2016-11-02 14:29:13

标签: python python-2.7 variables reference deep-copy

要理解为什么我在程序中遇到错误,我试图找到一个决定因素的“次要”,我写了一个更简单的程序,因为我的变量搞砸了。下面这个函数接受一个2 * 2矩阵作为输入,并返回一个包含其行的列表(无意义和低效,我知道,但我正在尝试理解这背后的理论)。

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 动态的值,因为我无法将B的初始值存储在B中以便以后使用它。那是为什么?

3 个答案:

答案 0 :(得分:10)

因为python通过引用传递列表 这意味着当你写“b = a”时,你说a和b是同一个对象,当你改变b时你也改变a,反之亦然

按值复制列表的方法:

new_list = old_list[:]

如果列表包含对象并且您也想要复制它们,请使用通用copy.deepcopy():

import copy
new_list = copy.deepcopy(old_list)

答案 1 :(得分:2)

A看起来像引用类型,而不是值类型。在分配时不复制引用类型(与例如R不同)。您可以使用copy.copy制作元素的深层副本

答案 2 :(得分:2)

由于Python通过引用传递列表,AB是相同的对象。修改B时,您还要修改A。可以通过一个简单示例演示此行为:

>>> A = [1, 2, 3]
>>> def change(l):
...     b = l
...     b.append(4)
... 
>>> A
[1, 2, 3]
>>> change(A)
>>> A
[1, 2, 3, 4]
>>> 

如果您需要A的副本,请使用切片表示法:

B = A[:]