创建了多维数组,但输出不是预期的

时间:2017-04-08 07:43:28

标签: python list list-comprehension

我怀疑当我创建一个带有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个索引都会被更改。< / p>

2 个答案:

答案 0 :(得分:3)

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

解决这种行为的方法是简单地将第一个理解放在第二个:

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

答案 1 :(得分:0)

在您的示例中,您将创建一个相同列表的列表,即对完全相同的列表的引用。如果你检查ID

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

>>> bs = array(4,5)
>>> [id(b) for b in bs]
[139931681000480, 139931681000480, 139931681000480, 139931681000480]

如果您arr[0][4] = 45只是更改第四个列表元素指向的内容而不是None元素自身。如果添加具有不同ID的列表

,则会更加清晰
>>> bs.append([1,2,3,4])
>>> bs[0][1] = 1
>>> bs
[[None, 1, None, None, None],
 [None, 1, None, None, None],
 [None, 1, None, None, None],
 [None, 1, None, None, None],
 [1, 2, 3, 4]]