Python:deepcopy(list)与new_list = old_list [:]
问题内容:
我正在从http://openbookproject.net/thinkcs/python/english2e/ch09.html执行练习9
,但遇到了没有意义的问题。
该练习建议使用copy.deepcopy()
来简化我的任务,但我不知道如何做到。
def add_row(matrix):
"""
>>> m = [[0, 0], [0, 0]]
>>> add_row(m)
[[0, 0], [0, 0], [0, 0]]
>>> n = [[3, 2, 5], [1, 4, 7]]
>>> add_row(n)
[[3, 2, 5], [1, 4, 7], [0, 0, 0]]
>>> n
[[3, 2, 5], [1, 4, 7]]
"""
import copy
# final = copy.deepcopy(matrix) # first way
final = matrix[:] # second way
li = []
for i in range(len(matrix[0])):
li.append(0)
# return final.append(li) # why doesn't this work?
final.append(li) # but this does
return final
我很困惑为什么这本书建议deepcopy()
在简单list[:]
复制时使用它。我使用错了吗?我的功能完全不正常吗?
我也有一些困惑返回值。问题是上面代码中的文档。
TIA
问题答案:
您问了两个问题:
深层副本与浅层副本
matrix[:]
是一个 浅表副本 -仅复制直接存储在其中的元素,而不递归地复制数组或内部其他引用的元素。这意味着:
a = [[4]]
b = a[:]
a[0].append(5)
print b[0] # Outputs [4, 5], as a[0] and b[0] point to the same array
如果将对象存储在中,也会发生同样的情况a
。
deepcopy()
自然地,它是一个 深层副本 -它递归地在树上一直递归复制其每个元素的副本:
a = [[4]]
c = copy.deepcopy(a)
a[0].append(5)
print c[0] # Outputs [4], as c[0] is a copy of the elements of a[0] into a new array
归来
return final.append(li)
与调用append
和返回不同,final
因为list.append不返回列表对象本身,而是返回None