如何在2D python数组中调用元素

时间:2019-05-27 00:27:05

标签: python arrays

我正在尝试更改2D数组中某个元素的值。 2D数组是一个num1 by num2矩阵,每个元素都为0。我正在尝试更改Rth 矩阵的Cth行的第1行

matrix = []
def make_matrix(num1, num2):
    row = []
    for i in range(num1):
        row.append(0)
    for i in range(num2):
        matrix.append(row)

def change_to_one(R, C):
    matrix[R-1][C-1] = 1

make_matrix(3, 2)
change_to_one(2, 1)
print(matrix)

它打印[[1, 0, 0], [1, 0, 0]]而不是[[0, 0, 0], [1, 0, 0]]

2 个答案:

答案 0 :(得分:1)

您的代码中有两个问题:

  • 执行matrix.append(row[:])时,您正在使用对原始列表的引用。只需将列表的元素复制为row[:]而不是使用row即可避免。否则,您对第一行所做的任何更改也将反映在所有其他行中。
  • 您忘记修改矩阵后返回。 这对您来说不是主要问题,因为您的matrix的范围是全球性的

matrix = []

def make_matrix(num1, num2):
    row = []
    for i in range(num1):
        row.append(0)
    for i in range(num2):
        matrix.append(row[:]) # <--- Use row[:] instead of row

def change_to_one(R, C):
    matrix[R-1][C-1] = 1
    return matrix # <---- return from here 

make_matrix(3, 2)
matrix = change_to_one(2, 1) # <---- save the returned result in a variable 
print(matrix)

# [[0, 0, 0], [1, 0, 0]]

答案 1 :(得分:1)

这与指针有关。 您首先定义row=[] matrix.append(row) num2次执行此操作时,您将附加row的地址,因此,如果您随时更改row,它将随后广播。

换句话说,更改row中的数据将更改您附加row的所有位置的数据,对于您而言,rows都是二维矩阵的所有def make_matrix(num1, num2): for i in range(num2): row = [] for i in range(num1): row.append(0) matrix.append(row)

尝试以下代码:

row

在这里,我们每次都会创建一个新的row,然后将其附加到我们的矩阵中,这样就不会广播任何from tkinter import * main = Tk() # Limpiar registros con botonLimpiar def valoresLimpiar(*args): varDes.set('Seleccionar...') varModo.set('Seleccionar...') varEst.set('Seleccionar...') # Obtener Valores con botonSimular def valoresSimular(*args): print(varDes.get()) print(varModo.get()) print(varEst.get()) # Variables varDes = StringVar(main) varDes.set('Seleccionar...') varModo = StringVar(main) varModo.set('Seleccionar...') varEst = StringVar(main) varEst.set('Seleccionar...') main.title("Configuración") main.configure(background = 'light grey') # Color de Fondo # Caja texto labelOpciones = Label(main, bg = "light grey", text = 'Ventana Deslizante', padx = 30, pady = 5, width=20) labelOpciones.grid(row = 0, column = 0) labelOpciones2 = Label(main, bg = "light grey", text = 'Modo de Transmisión', padx = 30, pady = 5, width=20) labelOpciones2.grid(row = 1, column = 0) labelOpciones3 = Label(main, bg = "light grey", text = 'Estrategia de Transmisión', padx = 30, pady = 5, width=20) labelOpciones3.grid(row = 2, column = 0) # Caja de Opciones opciones = ['1','2', '3', '4', '5', '6', '7'] ventanaDeslizante = OptionMenu(main, varDes, *opciones) ventanaDeslizante.config(width=20) ventanaDeslizante.grid(row = 0, column = 1, padx = 30, pady = 30) opciones2 = ['NRM','ABM'] ventanaModoTrans = OptionMenu(main, varModo, *opciones2) ventanaModoTrans.config(width=20) ventanaModoTrans.grid(row = 1, column = 1, padx = 30, pady = 30) opciones3 = ['GoBack-N','Repetición Selectiva'] ventanaEstTrans = OptionMenu(main, varEst, *opciones3) ventanaEstTrans.config(width=20) ventanaEstTrans.grid(row = 2, column = 1, padx = 30, pady = 30) # Botones Limpiar y Simular botonLimpiar = Button(main, text="Limpiar", width=20, command=valoresLimpiar) botonLimpiar.grid(row = 3, column = 0, padx = 20, pady = 30) botonSimular = Button(main, text="Simular", width=20, command=valoresSimular) botonSimular.grid(row = 3, column = 1, padx = 20, pady = 30) main.mainloop() 中的更改。

相关问题