Python - 数组复制/分配,numpy 的意外'=array[:]'行为



我正在阅读通过引用或值复制数组(&list(的相关内容。然而,我在这里遇到了一个问题。。为了说明我的问题,我举了三个例子,每个例子都有一个作业和一个变化。

第一个示例:默认情况下,它是通过引用复制的
因此,更改影响了a和ArrayA,它们都具有相同的地址。OK

第二个示例:由于首先评估右手边,*1不会更改其值,但会导致按值复制。(我认为这也可以通过其他几种方式来实现,比如使用copy((和..(
因此,更改只影响c,其地址与ArrayC不同。OK

第三个例子:在这里,我将[:]添加到数组中,从而复制数组(=按值(,据我所知。可以通过e和ArrayE的不同地址进行确认。然而,这一变化不仅影响e,也影响ArrayE。对我来说,这是出乎意料的,因为它以前甚至给我显示了不同的地址。为什么?

提前感谢=(

import numpy as np
# Example 1, by reference
ArrayA = np.array([5,2,3,5,4])
ArrayB = np.array(  [1,2,3,4])
a = ArrayA
a[1:] += ArrayB
print("{}:t{},tid: {}".format("ArrayA",ArrayA, id(ArrayA) ))
print("{}:t  {},tid: {}".format("ArrayB",ArrayB, id(ArrayB) ))
print("{}:t{},tid: {}".format("a",a, id(a) ))
ArrayC = np.array([5,2,3,5,4])
ArrayD = np.array(  [1,2,3,4])

# Example 2, by value
c = ArrayC*1
c[1:] += ArrayD
print()
print("{}:t{},tid: {}".format("ArrayC",ArrayC, id(ArrayC) ))
print("{}:t  {},tid: {}".format("ArrayD",ArrayD, id(ArrayD) ))
print("{}:t{},tid: {}".format("c",c, id(c) ))
# Example 3, by reference/value?!?!
ArrayE = np.array([5,2,3,5,4])
ArrayF = np.array(  [1,2,3,4])
e = ArrayE[:]
e[1:] += ArrayF
print()
print("{}:t{},tid: {}".format("ArrayE",ArrayE, id(ArrayE) ))
print("{}:t  {},tid: {}".format("ArrayF",ArrayF, id(ArrayF) ))
print("{}:t{},tid: {}".format("e",e, id(e) ))
ArrayA: [5 3 5 8 8],    id: 2450575020480
ArrayB:   [1 2 3 4],    id: 2450575021680
a:      [5 3 5 8 8],    id: 2450575020480
ArrayC: [5 2 3 5 4],    id: 2450575021280
ArrayD:   [1 2 3 4],    id: 2450575022080
c:      [5 3 5 8 8],    id: 2450575022240
ArrayE: [5 3 5 8 8],    id: 2450575022640
ArrayF:   [1 2 3 4],    id: 2450575022000
e:      [5 3 5 8 8],    id: 2450575022880

编辑-请参阅下面的@juanpa.arrivilaga评论。

在您的所有示例中,ndarrays都是
numpy.int32对象,它们是可变的
因此,从您的第三个示例来看,eArrayE都指向相同的numpy.int32对象
这就是为什么这些变化都反映在两者上
您可以通过检查他们的id来验证这一点。

print(id(e[0]) == id(ArrayE[0]))

最新更新