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

新手上路,请多包涵

为了理解为什么我在一个程序中遇到错误,在这个程序中我试图找到一个行列式的“次要”,我写了一个更简单的程序,因为我的变量被搞砸了。下面的这个函数将一个 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 的值,因为我无法将 A 的初始值存储在 B 中以供以后使用。这是为什么?

原文由 Sphener 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 250
2 个回答

因为 python 通过引用传递列表

这意味着当你写“b=a”时,你是在说 a 和 b 是同一个对象,当你改变 b 时,你也改变了 a,反之亦然

一种按值复制列表的方法:

 new_list = old_list[:]

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

 import copy
new_list = copy.deepcopy(old_list)

原文由 Nikaido 发布,翻译遵循 CC BY-SA 4.0 许可协议

由于 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[:]

原文由 Christian Dean 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题