增加時a.append( 'a ')就可以了。只要按順序加,就沒有問題 。
使用時,完全可以使用下標:
但出果引用不存在的下標,則會引發異常。這時,你需要先添加元素,再引用就沒有問題 了。如果想預先保留空間,可以使用迴圈來給list,每個元素一個預設值,再引用就不會有問題 了。
如:
代碼如下 |
複製代碼 |
a=[] for i in range(100): a.append([]) for j in range(100): a[i].append(0)
|
這樣就產生了一個100*100預設值為0的數組。
#建立一個寬度為3,高度為4的數組
#[[0,0,0],
# [0,0,0],
# [0,0,0],
# [0,0,0]]
myList = [[0] * 3] * 4但是當操作myList[0][1] = 1時,發現整個第二列都被賦值,變成
[[0,1,0],
[0,1,0],
[0,1,0],
[0,1,0]]
為什麼...一時搞不懂,後面翻閱The Python Standard Library 找到答案
list * n—>n shallow copies of list concatenated, n個list的淺拷貝的串連
例:
代碼如下 |
複製代碼 |
>>> lists = [[]] * 3 >>> lists [[], [], []] >>> lists[0].append(3) >>> lists [[3], [3], [3]][[]] |
是一個含有一個空列表元素的列表,所以[[]]*3表示3個指向這個空列表元素的引用,修改任何
一個元素都會改變整個列表:
所以需要用另外一種方式進行建立多維陣列,以免淺拷貝:
代碼如下 |
複製代碼 |
>>> lists = [[] for i in range(3)] >>> lists[0].append(3) >>> lists[1].append(5) >>> lists[2].append(7) >>> lists
|
[[3], [5], [7]]之前的二維數組建立方式為:
myList = [([0] * 3) for i in range(4)]
比如, 要動態建立一個 二維數組:
代碼如下 |
複製代碼 |
int** pTwoDimArr = new int[10][20]; pTwoDimArr[0][0] = 5; |
這樣好像很直觀,不過,編譯會出錯:
代碼如下 |
複製代碼 |
cannot convert from 'int (*)[20] ' to 'int ** ' |
如果這樣:
代碼如下 |
複製代碼 |
int pTwoDimArr[10][20]; pTwoDimArr[0][0] = 5; |
是可以的,但是 這個數組的記憶體卻是在棧上分配的,所以,
代碼如下 |
複製代碼 |
void main(){ int pTwoDimArr[1000][1000]; }
|
編譯沒問題,運行就會死掉
作為全域變數是可以的,但最好杜絕吧
代碼如下 |
複製代碼 |
int pTwoDimArr[1000][1000]; void main(){ } |
這樣:
代碼如下 |
複製代碼 |
int (*pTwoDimArr)[1000] = new int[1000][1000]; pTwoDimArr[0][0] = 5; |
動態分配是可以的, 一來記得釋放記憶體,二來維數還是要固定的(第一維可變),是不是有些不爽
因為 C++ 是“靜態”語言, 在編譯期要確定好一切,所以在多維陣列的定義時除了第一維可變外,其他幾維都要固定為常數,因為數組在記憶體中是線性儲存的。