Python:函数中数组/列表的本地副本

时间:2017-01-01 01:29:32

标签: python arrays list deep-copy shallow-copy

在“更改(标准杆)”功能中,“ par [:] ”是否已制作本地副本?它适用于列表,为什么它不适用于数组?

import numpy

def change(par):

    copy = par[:]
    copy[0] = 123


def main():

   L = [0, 0, 0]
   print '\nL before: ' + str(L)
   change(L)
   print 'L after: ' + str(L)

   A = numpy.zeros((1, 3))
   print '\nA before: ' + str(A)
   change(A[0])
   print 'A after: ' + str(A)


if __name__ == '__main__':
    main()

输出:

L before: [0, 0, 0]
L after: [0, 0, 0]

A before: [[ 0.  0.  0.]]
A after: [[ 123.    0.    0.]]

更新

感谢您指出“ par [:] ”是一个浅层副本,它不适用于数组。

那么在数组结构的情况下,“浅拷贝”如何工作?在列表的情况下,“浅拷贝”复制值,但当它变成数组时,“浅拷贝”只复制引用而不是值?

[:] ”如何区分何时复制值以及何时复制引用?

2 个答案:

答案 0 :(得分:0)

当你按照你的方式“复制”一个numpy数组时,你并没有真正复制它。您可以从中选择一系列元素(在您的情况下,所有元素)。该范围与数组的实际值相关联。把它想象成一个“窗口”,你看到一个“有限”的范围,但你实际上没有它的副本,你通过那个“窗口”进行操作。

对于python列表,你确实克隆了它。

如果要克隆numpy数组,可以使用复制方法:(numpy doc)

答案 1 :(得分:0)

正如评论所提到的,你正在通过语法[:]进行浅层复制,它只适用于单维列表

您可以使用copy模块中的deepcopy函数来克隆多维列表/数组

import copy
def change(par):
    copy = copy.deepcopy(par)
    copy[0] = 123