当我用None元素创建多维数组时,我有一个疑问,即
所有元素都具有相同的ID,但仅更改了一行中的元素。

def array(a, b):
    none = [None for _ in range(b)]
    return [none for _ in range (a)]


所以现在arr = array(4, 5)


  [[无,无,无,无,无],[无,无,无,无,无],
  [无,无,无,无,无],[无,无,无,无,无]]


现在当我做arr[0][4] = 45


  [[无,无,无,无,45],
  [无,无,无,无,45],
  [无,无,无,无,45],
  [无,无,无,无,45]]


每4个索引值更改为45
所以我尝试了

def id_array(a, b):
    none = [id(None) for _ in range(b)]
    return [none for _ in range (a)]


现在id_arr = id_array(4, 5)


  [[138022184、138022184、138022184、138022184、138022184],[138022184,
  138022184、138022184、138022184、138022184],[138022184、138022184,
  138022184、138022184、138022184],[138022184、138022184、138022184,
  138022184,138022184]]


即每个值都具有相同的id,因此在执行arr[0][4] = 45时不应将arr的每个值都更改为45,因为每个人都具有相同的id以及为什么只更改每行的第4个索引。

最佳答案

当您希望每个元素都与众不同时,您将对添加到返回值的每个元素重复使用相同的none列表。这就是为什么通过一个索引对none进行更新会反映在所有其他索引上的原因-因为您仅编辑单个列表,即使您可能对其有多个引用。

纠正此行为的方法是将第一个理解放在第二个内部:

def array(a, b):
    return [[None for _ in range(b)] for _ in range (a)]

10-08 04:01