Python - 数组 copying/assign,numpy 的意外“=array[:]”行为
Python - array copying/assign, unexpected '=array[:]' behaviour for numpy
我正在阅读有关通过引用或值复制数组 (&list) 的内容。但是,我 运行 这里遇到了一个问题。为了说明我的问题,我做了三个例子,每个例子都有一个赋值和一个变化。
第一个例子:默认是引用复制
因此,更改会影响 a 和 ArrayA,它们都具有相同的地址。好的
第二个示例: 由于首先计算右侧,因此 *1 不会更改其值,但会导致按值复制。 (我认为这也可以通过其他几种方式完成,比如使用 copy() 和 ..)
因此,更改只会影响 c,它的地址与 ArrayC 不同。好的
第三个例子:
据我所知,这里我将 [:] 添加到数组中,从而复制数组(=按值)。可以通过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.arrivillaga 的评论。
在您的所有示例中,ndarrays
的 值 是
numpy.int32
个对象,它们是 可变的。
因此,从您的第三个示例中,e
和 ArrayE
都指向相同的 numpy.int32
对象。
这就是为什么更改会反映在两者上的原因。
您可以通过检查他们的 ID 来验证这一点。
print(id(e[0]) == id(ArrayE[0]))
我正在阅读有关通过引用或值复制数组 (&list) 的内容。但是,我 运行 这里遇到了一个问题。为了说明我的问题,我做了三个例子,每个例子都有一个赋值和一个变化。
第一个例子:默认是引用复制
因此,更改会影响 a 和 ArrayA,它们都具有相同的地址。好的
第二个示例: 由于首先计算右侧,因此 *1 不会更改其值,但会导致按值复制。 (我认为这也可以通过其他几种方式完成,比如使用 copy() 和 ..)
因此,更改只会影响 c,它的地址与 ArrayC 不同。好的
第三个例子: 据我所知,这里我将 [:] 添加到数组中,从而复制数组(=按值)。可以通过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.arrivillaga 的评论。
在您的所有示例中,ndarrays
的 值 是
numpy.int32
个对象,它们是 可变的。
因此,从您的第三个示例中,e
和 ArrayE
都指向相同的 numpy.int32
对象。
这就是为什么更改会反映在两者上的原因。
您可以通过检查他们的 ID 来验证这一点。
print(id(e[0]) == id(ArrayE[0]))