Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中复制2d数组:混乱_Python_Multidimensional Array - Fatal编程技术网

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

在Python中复制2d数组:混乱,python,multidimensional-array,Python,Multidimensional Array,我的理解是: def copy_2d(p): return list(p) 将制作p的完整副本并作为结果返回。当我在repl中尝试时,list(p)似乎就是这样做的。但是,调用上述方法的方式似乎如下所示: b = [[1,2,3],[3,4,5]] a = copy_2d(b) a[0][0] = 0 if (b[0][0] == 0): print "Huh??" 它打印“嗯??”,也就是说,b似乎只是对a的引用。我仔细检查了一遍,但我可能是瞎子。有

我的理解是:

def copy_2d(p):
    return list(p)
将制作p的完整副本并作为结果返回。当我在repl中尝试时,list(p)似乎就是这样做的。但是,调用上述方法的方式似乎如下所示:

    b = [[1,2,3],[3,4,5]]
    a = copy_2d(b)
    a[0][0] = 0
    if (b[0][0] == 0): print "Huh??"
它打印“嗯??”,也就是说,b似乎只是对a的引用。我仔细检查了一遍,但我可能是瞎子。有人能澄清一下吗

import copy

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

您所做的复制了数组,其中包含所有值。但里面有数组的对象。您的函数没有复制列表内部,而是复制它们的引用


第二种解决方案仍然复制引用,但在其下方有一层。

浅层复制。和这里一样的逻辑


“list()将传递给它的iterable转换为列表。如果iterable已经是列表,则返回浅表副本,即只有最外层的容器是新的,其余对象仍然相同。”

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

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

def copy_2d(p):
    return map(list, p)   # warning: this only works as intended in Python 2
在Python2中,这是因为
map
返回一个列表。在Python3中,
map
函数返回一个迭代器,因此像
[list(inner)for inner In p]
这样的列表理解会更好


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

为什么不使用
copy.deepcopy()
?好的,但是我的问题呢?什么是
b
?如果我用
b=list(范围(1,10))
尝试你的例子,
a
b
是两个独立的数组。我不知道,只是提供一个建议。我已经更新了这个例子,使之非常明确
def copy_2d(p):
    return map(list, p)   # warning: this only works as intended in Python 2