2017-02-16 65 views
0

我有理解数组如何在Python中工作的问题。了解Python数组

我写这篇简短的演示代码:

from numpy import zeros 

a = zeros((3), 'd') 
b = zeros((2,3), 'd') 
for i in range(2): 
    for j in range(3): 
     a[j] = i*j 
    b[i] = a 
print "A: " + str(a) + "\n" 
print "B: " + str(b) 

的这个输出是:

A: [ 0. 1. 2.] 
B: [[ 0. 0. 0.] [ 0. 1. 2.]] 

因此,这里是我的问题。为什么不这样做的输出:

A: [ 0. 1. 2.] 
B: [[ 0. 1. 2.] [ 0. 1. 2.]] 

因为我在做同样的a和变化的数组的地址并没有改变。

+0

,因为你在范围B'与'了'' –

+0

改变子列表对所有i'引用(2)' - >你的第一个循环特征值'I = 0',设置对于所有的'j' - >'b [0] = [0],a [j]'= 0。 0.0]' – asongtoruin

+0

是的,但它是相同的地址。 b的所有子列表指向相同的地址。所以最后值应该是最后我写在数组或不是? –

回答

1

您似乎假定

b[i] = a 

插入一个参考ab。事实并非如此。分配给数组切片复制数据。此行为与使用列表的切片分配类似。

也许混淆来自它与其他方式不同吗?

a = b[i] 

不复制,它创建一个视图;这与列表切片不同。

+0

啊。好吧,我认为它就像在Java或C++中,它只是一个参考。谢谢! –

0

它的[0 0 0],因为:

第一圈开始用 “​​0” 让你有 “我” 的零:

一个[J] = 0 *∫

所有乘以0的值都是零。

+0

的引用是的,这很清楚。我的问题是以下。在第二次迭代中,我将值[0,1,2]写入数组a中。现在让我们说a的地址是0x2A。所以b [0]指向地址0x2A,而b [1]也指向地址0x2A。而0x2A是数组a,我为a所做的最后一项是[0,1,2]。所以b的内容应该是[[0,1,2],[0,1,2]] –

0

数组不会显示您期望的行为,但列表将会。请看下面的例子:

import numpy as np 

a = np.zeros(3, 'd') 
b = np.zeros(3, 'd') 
c = np.zeros((2,3), 'd') 

c[0] = a 
c[1] = b 

a[1] = 2 
b[0] = 1 

print 'Matrix A: {}'.format(a) 
print 'Matrix B: {}'.format(b) 
print 'Matrix C: {}'.format(c) 

a = [0, 0, 0] 
b = [0, 0, 0] 
c = [a, b] 

a[1] = 2 
b[0] = 1 

print 'List A: {}'.format(a) 
print 'List B: {}'.format(b) 
print 'List C: {}'.format(c) 

当我们使用矩阵,c[0]a当前值,c[1]确实为b相同。参考文献丢失,因此对ab的修改对c没有影响。因此,我们打印:

Matrix A: [ 0. 2. 0.] 
Matrix B: [ 1. 0. 0.] 
Matrix C: [[ 0. 0. 0.] 
[ 0. 0. 0.]] 

但是,对于列表,保留引用。因此,我们打印:

List A: [0, 2, 0] 
List B: [1, 0, 0] 
List C: [[0, 2, 0], [1, 0, 0]]