我怀疑当我创建一个带有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>
答案 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]]