2017-01-01 101 views
0

在函数“更改(参数)”中,是否“参数[:]”已经创建了本地副本?它适用于列表,为什么它不适用于数组?Python:函数中数组/列表的本地副本

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.]] 

UPDATE

感谢您指出 “相提并论[:]” 是一个浅拷贝,它不适合阵列工作。

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

[:]”如何区分何时复制值以及何时复制参考?

+1

你正在做一个浅拷贝 –

回答

0

当你像你一样“复制”一个numpy数组时,你并没有真正复制它。你从中选择一系列元素(在你的案例中,所有这些元素)。该范围链接到数组的实际值。把它想象成一个“窗口”,你会看到一个“有限”的范围,但你实际上没有它的副本,你通过那个“窗口”来做你的操作。

在python列表的情况下,你确实克隆它。

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

0

正如评论提到,你是语法[:]做浅拷贝,它仅适用于单维列表

您可以使用deepcopy功能从copy模块用于克隆多维列表/阵列

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