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

如何在2D python数组中调用元素,python,arrays,Python,Arrays,我试图更改2D数组中某个元素的值。 2D数组是一个num1乘以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)

我试图更改2D数组中某个元素的值。 2D数组是一个num1乘以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]]

您的代码中有两个问题:

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

matrix=[]
def制造矩阵(num1,num2):
行=[]
对于范围内的i(num1):
行。追加(0)
对于范围内的i(num2):

matrix.append(row[:])#代码中有两个问题:

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

matrix=[]
def制造矩阵(num1,num2):
行=[]
对于范围内的i(num1):
行。追加(0)
对于范围内的i(num2):

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

换句话说,更改
中的数据将更改附加在
中的所有数据,在您的情况下,这些数据都是2D矩阵的

请尝试以下代码:

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

在这里,我们每次都创建一个新的
,然后将其附加到矩阵中,这样就不会广播任何
中的更改。

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

换句话说,更改
中的数据将更改附加在
中的所有数据,在您的情况下,这些数据都是2D矩阵的

请尝试以下代码:

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

在这里,我们每次都创建一个新的
,然后将其附加到矩阵中,这样就不会广播任何
中的更改。

函数中的矩阵
用作“全局”变量。即使没有
返回按钮
,它似乎也能工作,对吗?@Dino:你说得对。在这里,它也将毫无回报地发挥作用,这通常不是一个好的做法。虽然函数中的
矩阵
用作“全局”变量,但我会将您的观点添加到我的答案中。即使没有
返回按钮
,它似乎也能工作,对吗?@Dino:你说得对。在这里,它也将毫无回报地发挥作用,这通常不是一个好的做法。我将把你的观点添加到我的答案中,尽管
matrix=[[0]*3代表范围(2)]
matrix=[[0]*3代表范围(2)]