【问题标题】:Python: Local copy of array / list in functions [duplicate]Python:函数中数组/列表的本地副本[重复]
【发布时间】:2017-01-01 01:29:31
【问题描述】:

在函数“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[:]”是浅拷贝,不适用于数组。

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

[:]”如何区分何时复制值和何时仅复制引用?

【问题讨论】:

  • 你在做浅拷贝

标签: python arrays list deep-copy shallow-copy


【解决方案1】:

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

对于 python 列表,您确实克隆了它。

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

【讨论】:

    【解决方案2】:

    正如评论中提到的,您正在通过语法[:] 进行浅拷贝,它仅适用于单维列表

    您可以利用copy 模块中的deepcopy 函数来克隆多维列表/数组

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-03
      • 2012-11-10
      • 2019-11-16
      • 1970-01-01
      • 1970-01-01
      • 2018-05-29
      相关资源
      最近更新 更多