Python:函数中数组/列表的本地副本
在函数“更改(par)”中,“par[:]”是否已制作本地副本?它适用于列表,为什么不适用于数组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
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
你在做肤浅的复制