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