在Python中复制2d数组:混乱

时间:2017-09-19 12:25:58

标签: python multidimensional-array

我的理解是:

def copy_2d(p):
    return list(p)

将制作p的完整副本并将其作为结果返回。 list(p)似乎在我在repl中尝试时这样做。然而,似乎像这样调用上面的方法:

    b = [[1,2,3],[3,4,5]]
    a = copy_2d(b)
    a[0][0] = 0
    if (b[0][0] == 0): print "Huh??"

打印"嗯??",也就是说,b似乎只是对a的引用。我仔细检查过,但我可能会失明。有人可以澄清吗?

3 个答案:

答案 0 :(得分:2)

import copy

def copy_2d(p):
    return copy.deepcopy(p)

def copy_2d(p):
    return [list(p2) for p2 in p]

你做了什么用里面的所有值复制了数组。但是在你的内部有数组的对象。您的函数没有复制到列表中,而是复制它们的引用。

第二个解决方案仍然复制引用,但下面是一层。

答案 1 :(得分:2)

制作浅拷贝。和这里的逻辑相同吗?what-does-the-list-function-do-in-python

“list()将传递给它的iterable转换为列表。如果iterable已经是一个列表,那么返回一个浅拷贝,即只有最外面的容器是新的其余对象仍然是相同的。” p>

答案 2 :(得分:2)

copy_2d的当前代码返回您传递的列表的浅表副本作为其参数。也就是说,您正在创建一个新的外部列表,但不会复制内部值(可能是列表本身)。新列表引用相同的内部列表,因此当您改变其中一个列表时,您将看到浅层副本中的更改与原始列表中的相同。

您可以通过复制内部列表以及创建新的外部列表来解决问题。尝试:

def copy_2d(p):
    return map(list, p)   # warning: this only works as intended in Python 2

在Python 2中,这可行,因为map返回一个列表。在Python 3中,map函数返回一个迭代器,因此像[list(inner) for inner in p]这样的列表理解会更好。

当然,如果您不需要编写自己的代码来解决此问题,则应该使用标准库中的copy.deepcopy