1. 程式人生 > >Python 2.7 建立二維陣列

Python 2.7 建立二維陣列

前言:
從java到cobol,一直沒有把陣列的坑填過。
至少現在把python的二維陣列的坑填上~~
只要開始,都不算晚

二維陣列的建立beginning~
Python中的list、tuple預設都是一維的。

方式一

lst2 = [1, 2, [3, 4]]

等同於:

lst = [1, 2]
lst.append([3, 4])
print lst
# 輸出結果
[1, 2, [3, 4]]

等同於:

lst3 = [1, 2]
lst3.insert(2, [3, 4])
print lst3

注意:

lst = []
lst.append([])
lst[0
][0] = 1 # 不論是否有這一句,都會報錯 print lst # 不會報錯 print lst[0][0] # 編譯器報錯-->IndexError: list index out of range

如果要給二維陣列的第一個元素賦值,需要用append,可以改寫為:

lst[0].append(100)
print lst[0][0]
# 輸出結果
100

方式二:

建立一個寬度為3,高度為4的陣列
[[0,0,0],
[0,0,0],
[0,0,0],
[0,0,0]]

以下A、B哪個是一維陣列,哪個是二維陣列,^_^

A = [0] * 3 * 4
B = [[0] * 3] *
4 print A print B

問題:如此建立陣列B後,當操作B[0][1] = 2時,整個第二列都被賦值了。

[[0, 2, 0], [0, 2, 0], [0, 2, 0], [0, 2, 0]]

為什麼?
原因:list * n—>n shallow copies of list concatenated, n個list的淺拷貝的連線(淺拷貝、深拷貝單獨寫一文)
例1:

lst = [[]] * 3
print lst
lst[0].append(3)
print lst
# 輸出結果
[[3], [3], [3]]

[[]]是一個含有一個空列表元素的列表,所以[[]]*3表示3個指向這個空列表元素的引用,修改任何一個元素都會改變整個列表。

例2(類似情況):

A = [3] * 3
B = A
B[0] = 1
print A
print B
# 輸出結果
[1, 3, 3]
[1, 3, 3]

所以需要用另外一種方式進行建立二維陣列,以免淺拷貝

lst = [[] for i in range(3)]
lst[0].append(3)
lst[0].append(6)
lst[1].append(5)
lst[2].append(9)
print lst
# 輸出結果為:
[[3, 6], [5], [9]]

二維陣列的建立方式為:*

lst = [[0] * cols for i in range(rows)]

方式三:

lst = []
for i in range(3):
    lst.append([])
    lst[i].append(i)
print lst
# 輸出結果
[[0], [1], [2]]   

ps:官方解釋:https://docs.python.org/2.7/library/index.html