数组相乘和循环创建数组的区别是什么?



由于某种原因,当我做第二个时,它按我想要的方式工作,但是当我使用第一个时,我试图追加它追加到所有列表。具体来说,最下面的一行就是区别所在。

count = [[]] * (len(nums) +1)
count = [[] for i in range(len(nums)+1)]
for key, val in myMap.items():
count[val].append(key)

对于第一个选项,所有子列表都指向同一个列表,因为您正在"克隆"&;的参考。所以如果你修改了一个,所有的都会被修改:

count = [[]] * (3)
print(count)  # [[], [], []]
count[0].append(1)
print(count)  # [[1], [1], [1]]

否则,进行列表推导(循环)将创建不同的子列表,因为您在每次迭代中实例化一个新列表。所以如果你修改了一个,只会被修改:

count = [[] for i in range(3)]
print(count)  # [[], [], []]
count[0].append(1)
print(count)  # [[1], [], []]

第一个版本只是简单地乘以相同的对象。这里没有n不同的列表。都是同一个列表

count = [[]] * (len(nums) +1)
print(count)
[[], [], [], []]

通过打印这些列表的id,我们可以很容易地看到这一点。它们完全一样。如果你在第一个列表中添加新元素,它也会出现在其他列表中。因为它们是一样的。

print(f"first - {id(count[0])}")
print(f"second = {id(count[1])}")
count[0].append(1)
print(count)
first - 4310957440
second -4310957440
[[1], [1], [1], [1]]

在第二个版本中,您生成新的列表,它们是不同的。您可以通过打印ID值来检查自己。

count = [[] for i in range(3+1)]
print(count)
[[], [], [], []]
print(f"first - {id(count[0])}")
print(f"second = {id(count[1])}")
first - 4310956160
second -4310940416

最新更新