蟒蛇 |正確使用二維數組/列表

| | | | | |

方法 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" 運算符,它檢查兩個操作數是否引用同一個對象。


行,列 = ( 5 , 5 )

# 方法 2b

arr = [[ 0 for i in range ( cols)] for j in range (rows)]


# 檢查 arr [0] 和 arr [1] 是否引用
# 同一個對象

print (arr [ 0 ] is arr [ 1 ] ) # 打印 False


# 方法 2a

arr = [[ 0 ] * cols] * rows


# 檢查 arr [0] 和 arr [1] 是否引用
# that sam e object
# 打印 True,因為只有一個
# 要創建的對象列表。
# code>

print (arr [ 0 ] is arr [ 1 ])

退出:

False True 

蟒蛇 |正確使用二維數組/列表 Arrays: Questions

蟒蛇 |正確使用二維數組/列表 exp: Questions

Shop

Best Python online courses for 2022

$

Best laptop for Fortnite

$

Best laptop for Excel

$

Best laptop for Solidworks

$

Best laptop for Roblox

$

Best computer for crypto mining

$

Best laptop for Sims 4

$

Best laptop for Zoom

$499

Latest questions

NUMPYNUMPY

psycopg2: insert multiple rows with one query

12 answers

NUMPYNUMPY

How to convert Nonetype to int or string?

12 answers

NUMPYNUMPY

How to specify multiple return types using type-hints

12 answers

NUMPYNUMPY

Javascript Error: IPython is not defined in JupyterLab

12 answers

Wiki

Python OpenCV | cv2.putText () method

numpy.arctan2 () in Python

Python | os.path.realpath () method

Python OpenCV | cv2.circle () method

Python OpenCV cv2.cvtColor () method

Python - Move item to the end of the list

time.perf_counter () function in Python

Check if one list is a subset of another in Python

Python os.path.join () method