我正在尝试更改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]]
答案 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()
中的更改。