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

问题描述 投票:1回答:1

我正在按引用或值读取复制数组(&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
python arrays list pass-by-reference pass-by-value
1个回答
0
投票

编辑-参见下面的@ juanpa.arrivillaga的评论。

在您的所有示例中,ndarraysvaluesnumpy.int32个对象,它们是mutable。因此,从您的第三个示例来看,eArrayE都指向相同的numpy.int32对象。这就是为什么更改会同时反映在两者上的原因。您可以通过检查其ID来验证。

print(id(e[0]) == id(ArrayE[0]))
© www.soinside.com 2019 - 2024. All rights reserved.