Python | 2D配列/リストを正しい方法で使用する

| | | | | |

方法1a


#1D配列を作成する最初の方法

N = 5

arr = [ 0 ] * N

print (arr)

出力:

 [0、0、0、0、0] 

メソッド1b

<コードクラス= "comments">#配列1を作成する2番目の方法D

N = 5

arr = [ 0 for i in range (N)]

print (arr)

終了:

 [0、0、0、0、0] 

上記を拡張して、2次元配列を定義できます
メソッド2a


#上記の最初のメソッドを使用して
#2D配列

行、列 = 5 5

arr = [[ 0 ] * cols] *

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


#上記の2番目のメソッドを使用して
#2D配列

行を作成します。 cols = 5 5

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

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]] 

どちらの方法でも現在と同じ結果が得られるようです。メソッド2aとメソッド2bの配列の要素の1つを置き換えましょう。


#Python3プログラムでどのように機能するかを示します
#メソッド1とメソッド2。

rows、cols = 5 5


#メソッド2a

arr = [[ 0 ] * cols] *


#最初の変更element
#最初の行を1に設定し、配列を出力します

arr [ 0 ] [ 0 ] = 1

< / p>

for in arr:

印刷(行)

#次を出力します
#[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 範囲(行)]


#この新しい配列に戻ると、変更できます
#最初の行の最初の要素
#を1に設定し、配列を出力します

arr [ 0 ] [ 0 ] = 1

for in arr:

print (行)


#期待どおりに以下を出力します
#[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] < / p>

終了:

 [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つの整数オブジェクトを作成せず、1つの整数オブジェクトのみを作成します。 arr配列のインデックスは、示されているのと同じintオブジェクトを指します。


0番目のインデックスを別の整数(たとえば1)に割り当てると、値1で新しい整数オブジェクトが作成され、次に示すように、0番目のインデックスがこの新しいintオブジェクトを指すようになります

同様に、 "arr = [[0] * cols]*row"のような2次元配列を作成する場合、実際、私たちは上記のアナロジーを拡張しています。
1。整数オブジェクトは1つだけ作成されます。
2。 1つのリスト1dが作成され、そのすべてのインデックスがポイント1の同じintオブジェクトを指します。
3。ここで、arr [0]、arr [1]、arr [2]、Ķ。 arr [n-1]はすべて、手順2で上記の同じリストオブジェクトを指します。

上記の設定は、下の画像で視覚化できます。

次に、最初の行の最初の要素を変更しましょう" arr "as
arr [0] [0] = 1

=&gt; arr [0]は、上記で作成したものと同じリストオブジェクトを指します(arr [1]、arr [2]、Ķarr [n-1]も同じリストオブジェクトを指すことに注意してください)
=&gt; arr [0] [0]を割り当てると、値が1の新しいintオブジェクトが作成され、arr[0][0]がこの新しいintオブジェクトを指すようになります。 (したがって、arr [1] [0]、arr [2] [0]、Ķarr [n-1] [0]になります)

これは下の画像ではっきりとわかります。 。


したがって、2D配列がこのように作成されると、配列内のすべての行によって参照される整数オブジェクトとリストオブジェクトは基本的に1つしかないため、特定の行の値はすべての文字列に影響します。

ご想像のとおり、追跡します。この浅いリストの使用によって引き起こされるエラー。複雑。したがって、2D配列を宣言する最良の方法は、


rows、cols = 5 5

arr = [[ 0 for i in range (cols)] for j in 範囲(行)]

終了:

 

このメソッドはメソッド2aとは対照的に、5つの個別のリストオブジェクト。これを確認する1つの方法&#8212; 「is」演算子を使用して、2つのオペランドが同じオブジェクトを参照しているかどうかを確認します。


行、列 = 5 5

#メソッド2b

arr = [[ 0 for i in range ( cols)] for j in 範囲(行)]


#arr[0]とarr[1]が
#同じオブジェクト

print (arr [ 0 ] arr [ 1 ]) #Falseを出力


#メソッド2a < / p>

arr = [[ 0 ] * cols] *


#arr[0]とarr[1]が
#そのsamを参照しているかどうかを確認しますe object
#1つしかないためTrueを出力します
#作成するオブジェクトのリスト。

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

終了:

 False True 

Shop

Learn programming in R: courses

$

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

$

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