Python 2.7 建立二維陣列
阿新 • • 發佈:2018-10-31
前言:
從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]]