Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:函数中数组/列表的本地副本_Python_Arrays_List_Deep Copy_Shallow Copy - Fatal编程技术网

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

Python:函数中数组/列表的本地副本,python,arrays,list,deep-copy,shallow-copy,Python,Arrays,List,Deep Copy,Shallow Copy,在函数“更改(par)”中,“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

在函数“更改(par)”中,“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[:]”是一个浅拷贝,不适用于数组

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

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

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

在python列表的情况下,您确实可以克隆它


如果要克隆numpy数组,可以使用copy方法:

如注释所述,您正在按语法执行浅层复制,
[:]
,它仅适用于一维列表

您可以使用模块中的
deepcopy
功能克隆多维列表/数组

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

你在做肤浅的复制