Python | Usando arrays/listas 2D da maneira certa

| | | | | |

Método 1a


# Primeira maneira de criar array 1 D

N = 5

arr = [ 0 ] * N

print (arr)

Saída:

[0, 0, 0, 0, 0] 

Método 1b

# Segunda maneira de criar array 1 D

N = 5

arr = [ 0 para i em intervalo (N)]

print (arr)

Sair:

[0, 0, 0, 0, 0 ] 

Estendendo o acima, podemos definir arrays bidimensionais das seguintes maneiras.
Método 2a


# Usando o primeiro método acima para criar
# array 2D

linhas, colunas = ( 5 , 5 )

arr = [[ 0 ] * cols] * linhas

print (arr)

Sair:

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

Método 2b


# Usando o segundo método acima para criar
# array 2D

linhas, cols = ( 5 , 5 )

arr = [[ 0 para i em intervalo (colunas)] for j em intervalo (linhas)]

print (arr)

Saída:

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

Ambos os métodos parecem dar o mesmo resultado que agora. Vamos substituir um dos elementos no array do método 2a e do método 2b.


# Programa Python 3 para demonstrar como funciona
# método 1 e método 2.

linhas , colunas = ( 5 , 5 )


# método 2a

arr = [[ 0 ] * cols] * linhas


# altera a primeira element
# primeira linha para 1 e imprima o array

arr [ 0 ] [ 0 ] = 1

para linha em arr:

print (linha)

# gera o seguinte
# [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]


# método 2b

arr = [[ 0 para i em intervalo (colunas)] for j em intervalo (linhas)]


# de volta para este novo array permite que você altere
# primeiro elemento da primeira linha
# para 1 e imprima o array

arr [ 0 ] [ 0 ] = 1

para linha em arr:

print (linha)


# gera o seguinte como esperado
# [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]

Sair:

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

Esperamos apenas o primeiro elemento de a primeira linha mudará para 1, mas o primeiro elemento de cada linha mudará para 1 no método 2a. Esse tipo de funcionamento se deve ao fato de Python usar listas superficiais, que tentaremos entender.

No método 1a, Python não cria 5 objetos inteiros, mas cria apenas um objeto inteiro, e todos os índices do array arr apontam para o mesmo objeto int mostrado.


Se atribuirmos o índice 0 a outro inteiro, digamos 1, um novo objeto inteiro será criado com o valor 1 e o índice 0 agora apontará para esse novo objeto int, conforme mostrado abaixo

Da mesma forma, quando criamos um array bidimensional como" arr = [[0] * cols] * row " , na verdade estamos expandindo a analogia acima.
1. Apenas um objeto inteiro é criado.
2. Uma lista 1d é criada e todos os seus índices apontam para o mesmo objeto int no ponto 1.
3. Agora arr [0], arr [1], arr [2]…. arr [n-1] todos apontam para o mesmo objeto de lista acima na etapa 2.

A configuração acima pode ser visualizada na imagem abaixo.

Agora vamos alterar o primeiro elemento na primeira linha" arr "as
arr [0] [0] = 1

=" arr [0] aponta para o mesmo objeto de lista que criamos acima (lembre-se que arr [1], arr [2]‚Ķ arr [n-1] também aponta para o mesmo objeto de lista)
= & gt ; A atribuição de arr [0] [0] criará um novo objeto int com um valor de 1, e arr [0] [0] agora apontará para esse novo objeto int. (E assim será arr [1] [0], arr [2] [0]‚Ķ arr [n-1] [0])

Isso pode ser visto claramente na imagem abaixo .


Então, quando arrays 2d são criados dessa maneira, alterando os valores ‚Äã‚Äãem uma determinada linha afetarão todas as strings, pois existe essencialmente apenas um objeto inteiro e apenas um objeto de lista referenciado por todas as linhas na matriz.

Como seria de esperar, rastreie erros causados por este uso de listas superficiais. complicado. Portanto, a melhor maneira de declarar um array 2d é


rows, cols = ( 5 , 5 )

arr = [[ 0 para i em intervalo (cols)] para j em intervalo (rows )]

Exit:

 

Este método cria 5 objetos de lista separados em oposição ao método 2a. Uma maneira de verificar este — use o operador "is", que verifica se dois operandos se referem ao mesmo objeto.


linhas, colunas = ( 5 , 5 )

# método 2b

arr = [[ 0 para i em range ( cols)] para j em intervalo (linhas)]


# verifique se arr [0] e arr [1] se referem a
# mesmo objeto

print (arr [ 0 ] é arr [ 1 ] ) # imprime False


# método 2a

arr = [[ 0 ] * cols] * linhas


# verifica se arr [0] e arr [1] se referem a
# esse sam e objeto
# imprime True porque existe apenas uma
# lista do objeto a ser criado. code>

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

Sair:

Falso Verdadeiro 

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