在函数"change(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“是一个浅拷贝,它不适用于数组。
那么,在数组结构的情况下,“浅拷贝”是如何工作的呢?对于list,“浅拷贝”复制值,但是当它变成数组时,“浅拷贝”只是复制引用而不是值?
"“如何区分何时复制值和何时仅复制引用?
发布于 2017-01-01 01:36:55
当您以您的方式“复制”一个numpy数组时,您并不是真正地复制它。您可以从中选择一系列元素(在您的例子中,所有元素都是这样)。该范围与数组的实际值相链接。把它想象成一个“窗口”,你可以看到一个“有限的”范围,但是你实际上没有它的副本,你通过那个“窗口”来做你的操作。
在python列表的情况下,您确实克隆了它。
如果要克隆numpy数组,可以使用copy方法:(矮胖的医生)
发布于 2017-01-01 01:45:20
正如注释所提到的,您正在通过语法[:]
进行浅拷贝,它只适用于一维列表。
您可以利用deepcopy
函数从复制模块克隆多维列表/数组。
import copy
def change(par):
copy = copy.deepcopy(par)
copy[0] = 123
https://stackoverflow.com/questions/41412773
复制相似问题