我的理解是:
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的引用。我仔细检查过,但我可能会失明。有人可以澄清吗?
答案 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
。