0

番号 n の約数を、マスター リストの n 番目の位置に格納されたリストとして取得したいと考えています。たとえば、長さ 11 のふるいでは、sieve[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]

それは説明してもらえますか?

4

2 に答える 2

4

次の例を検討してください。

>>> a = [[]] * 5
>>> a
[[], [], [], [], []]
>>> a[0].append(1)
>>> a
[[1], [1], [1], [1], [1]]

リストの積として宣言するsieveと、個々のリストはそれぞれ同じオブジェクトであり、1 つに加えられた変更はすべてに反映されます。したがって、それを修正する必要があります。

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
于 2014-03-07T08:57:16.137 に答える
2

用語によって作成された同じ配列のコピーがあり[[]] * 11ます。したがって、内側の配列の 1 つを変更すると、すべてが同じ方法で変更されます。

[ [] for i in range(11) ]たとえば、sth のように、独立した配列のリストを作成できます。

于 2014-03-07T08:57:23.707 に答える