2017-02-16 87 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]]