【问题标题】:Copy a list of list by value and not reference [duplicate]按值复制列表列表而不是引用[重复]
【发布时间】:2017-03-15 21:58:12
【问题描述】:

为了理解为什么我在程序中遇到错误,我试图在其中找到行列式的“次要”,我编写了一个更简单的程序,因为我的变量搞砸了。下面的这个函数接受一个 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 中以供以后使用。这是为什么呢?

【问题讨论】:

  • array.append(A) 真的应该是mylist.append(A) 吗?如果没有,array 定义在哪里?
  • 恐怕您从文档中复制了 array.append(A) 而没有考虑到“array”是您要附加到的实际数组,即与该数组对应的变量,而不是“array” “ 包裹。如果我错过了什么对不起?
  • 为了获得漂亮的可视化效果,请将 [one] 与 [two] 进行比较。 [1]:pythontutor.com/… [2]:pythontutor.com/…

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


【解决方案1】:

因为python通过引用传递列表

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

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

new_list = old_list[:]

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

import copy
new_list = copy.deepcopy(old_list)

【讨论】:

  • 在这种情况下,您需要创建一个deepcopy,因为它们有一个列表列表。
  • 天哪,我已经花了好几个小时来弄清楚为什么使用在 javascript 中完美运行的列表的递归算法在 python 中给了我各种疯狂的结果.....copy.deepcopy 全能跨度>
【解决方案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[:]

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • copy.copy 进行浅拷贝... copy.deepcopy 像其他人所说的那样进行深拷贝
    猜你喜欢
    • 2017-09-04
    • 2012-02-03
    • 2011-01-28
    • 2011-02-07
    • 2016-10-22
    • 1970-01-01
    • 2012-11-25
    相关资源
    最近更新 更多