在“更改(标准杆)”功能中,“ 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 [:] ”是一个浅层副本,它不适用于数组。
那么在数组结构的情况下,“浅拷贝”如何工作?在列表的情况下,“浅拷贝”复制值,但当它变成数组时,“浅拷贝”只复制引用而不是值?
“ [:] ”如何区分何时复制值以及何时复制引用?
答案 0 :(得分:0)
当你按照你的方式“复制”一个numpy数组时,你并没有真正复制它。您可以从中选择一系列元素(在您的情况下,所有元素)。该范围与数组的实际值相关联。把它想象成一个“窗口”,你看到一个“有限”的范围,但你实际上没有它的副本,你通过那个“窗口”进行操作。
对于python列表,你确实克隆了它。
如果要克隆numpy数组,可以使用复制方法:(numpy doc)
答案 1 :(得分:0)
正如评论所提到的,你正在通过语法[:]
进行浅层复制,它只适用于单维列表
您可以使用copy模块中的deepcopy
函数来克隆多维列表/数组
import copy
def change(par):
copy = copy.deepcopy(par)
copy[0] = 123