方法 1a
# 第一種創建一維數組的方法
N
=
5
arr
=
[
0
]
*
N
print
(arr)
輸出:
[0, 0, 0, 0, 0]
方法1b
<代碼類= "comments"> # 第二種方式創建一維數組
N
=
5
arr
=
[
0
for
i
in
range
(N)]
print
(arr)
退出:
[0, 0, 0, 0, 0 ]
擴展上面,我們可以定義二維數組
方法2a
#使用上面第一種方法創建
# 二維數組
rows, cols
=
(
5
,
5
)
arr
= 代碼>
[[
0
]
*
cols]
*
rows
print
(arr)
退出:
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
方法2b
# 使用上面第二種方法創建
# 二維數組
行, cols
=
(
5
,
5
)
arr
=
[[
0
for
i
in
range
(cols)]
for
j
in
range
(rows)]
打印
(arr)
輸出:
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0 , 0, 0], [0, 0, 0, 0, 0]]
這兩種方法的結果似乎和現在一樣。讓我們替換方法 2a 和方法 2b 的數組中的一個元素。
# Python 3 程序來演示它是如何工作的
# 方法 1 和方法 2。
行,列
=
(
5
,
5
)
# 方法 2a
arr
=
[[
0
]
*
cols]
*
rows
# 改第一個element
# 第一行為 1 並打印數組
arr [
0
] [
0
]
=
1
for
行
in
arr:
print
(row)
# 輸出如下
# [1, 0, 0, 0, 0]
# [1, 0, 0, 0, 0]
# [1, 0, 0, 0, 0]
# [1, 0, 0, 0, 0]
# [1, 0, 0, 0, 0]
# [1, 0, 0, 0, 0]
代碼>
# 方法 2b
arr
=
[[
0
for
i
in
range
(cols)]
for
j
in
range
(rows)]
# 回到這個新數組讓你改變
# 第一行的第一個元素
# 為 1 並打印數組
arr [
0
] [
0
]
=
1
for
行
in
arr:
print
(row)
# 按預期輸出以下內容
# [1, 0, 0, 0, 0]
# [0, 0, 0, 0, 0]
# [0, 0, 0, 0, 0]
# [0, 0, 0, 0, 0]
# [0, 0, 0, 0, 0]
退出:
[1, 0, 0, 0, 0] [1, 0, 0, 0, 0] [1 , 0, 0 , 0, 0] [1, 0, 0, 0, 0] [1, 0, 0, 0, 0] [1, 0, 0, 0, 0] [0, 0, 0, 0 , 0] [ 0, 0, 0, 0, 0] [0, 0, 0, 0, 0] [0, 0, 0, 0, 0]
我們期望只有第一個元素將第一行更改為 1,但在方法 2a 中每行的第一個元素將更改為 1。這種功能是由於 Python 使用了淺表,我們將嘗試理解這一點。
在方法 1a 中,Python 不創建 5 個整數對象,而是只創建一個整數對象,並且所有arr 數組的索引指向同一個 int 對象,如圖所示。
如果我們將第 0 個索引分配給另一個整數,比如 1,則創建一個值為 1 的新整數對象,然後第 0 個索引現在指向這個新的 int 對象,如下所示
同樣,當我們創建一個二維數組時,像 "arr = [[0] * cols] * row " ,我們其實是在擴展上面的類比。
1.僅創建一個整數對象。
2。創建了一個列表 1d,它的所有索引都指向點 1 處的同一個 int 對象。
3。現在 arr [0],arr [1],arr [2],Ķ。 arr [n-1] 都指向上面第2步中的同一個列表對象。
上面的設置可以在下圖中可視化。
現在讓我們把第一行的第一個元素"arr"改成
arr [0] [0] = 1
=> arr [0] 指向我們在上面創建的同一個列表對象(記住 arr [1], arr [2],Ķ arr [n-1] 也指向同一個列表對象)
="分配 arr [0] [0] 將創建一個值為 1 的新 int 對象,並且 arr [0] [0] 現在將指向這個新的 int 對象。 (所以它將是 arr [1] [0],arr [2] [0],Ķ arr [n-1] [0])
這可以在下圖中清楚地看到.
所以當以這種方式創建二維數組時,改變某行中的值 ‚Äã‚Äã 將影響所有字符串,因為數組中的所有行實際上只有一個整數對象和一個列表對象。
如您所料,追查這種使用淺表導致的錯誤。複雜的。因此,聲明二維數組的最佳方式是
rows, cols
= 代碼>
(
5
,
5
)
arr
=
[[
0
for
i
in
range
(cols)]
j
in
range
(rows )]
Exit:
這個方法創建5 個單獨的列表對象,而不是方法 2a。檢查此 — 的一種方法使用 "is" 運算符,它檢查兩個操作數是否引用同一個對象。
退出: False True 蟒蛇 |正確使用二維數組/列表 Arrays: Questions蟒蛇 |正確使用二維數組/列表 exp: QuestionsShopLatest questions Wiki |