2017-01-01 26 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