我希望得到数字n的除数作为存储在第n个位置的主列表中的列表。例如长度为11的筛子,我想要筛子[6] == [2,3,6](忽略1)。我的代码不起作用,并以令人不愉快的方式让我感到惊讶:
sieve = [[]]*11
sieve[1] = [1]
for i in range(2,11):
for j in range(i,11,i):
sieve[j].append(i)
print ("appended", i ," at sieve",j)
# This check-print statement shows that it works fine until sieve is printed.
print (sieve)
sieve[6] turns out to be : [2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 7, 8, 9, 10]
可以解释一下吗?
答案 0 :(得分:4)
考虑这个例子:
>>> a = [[]] * 5
>>> a
[[], [], [], [], []]
>>> a[0].append(1)
>>> a
[[1], [1], [1], [1], [1]]
当您将sieve
声明为列表的产品时,每个列表都是同一个对象,对一个列表所做的更改会反映在所有列表中。所以你需要解决这个问题。
sieve = [[] for _ in xrange(11)]
您当然可以通过使用列表理解来简化整个过程。
sieve = [[], [1], [2]] + [[j for j in xrange(2, i) if i%j == 0] for i in xrange(3, 11)] # 0, 1, and 2 are special cases
答案 1 :(得分:2)
您拥有由术语[[]] * 11
创建的相同数组的副本。因此,如果您修改其中一个内部数组, all 将以相同的方式进行修改。
您可以创建一个独立数组列表,例如[ [] for i in range(11) ]
。