5

現時点では、プロジェクト euler の問題を解決することでプログラミング スキルを練習していますが、Python で (私の意見では) 奇妙な動作に遭遇しました。

私がする時:

list = [[1]]*20

期待どおり、要素 1 を含む 20 個のリストのリストを取得します。ただし、このリストの 3 番目の要素に 2 を追加する場合は、次のようにします。

list[3].append(2)

ただし、これはリスト内のすべての要素を変更します。寄り道するときも、

l = list[3]
l.append(2)
list[3] = l

すべての要素が変更されます。誰でもこれを行う方法を教えて、次のような出力を得ることができますか:

[[1], [1], [1], [1, 2], [1] .... [1]]

前もって感謝します。

4

1 に答える 1

12

Python リストは変更可能なオブジェクトであるため、リスト オブジェクトを1 つ[[1]]*20作成し、それへの 20 個の参照をトップレベル リストに配置します。[1]

可変性の問題に関する限り、これは次と同じです

a = [1,2,3]
b = a
b.append(4)
a # [1,2,3,4]

これは、単にリスト インスタンスへの参照b=aを から にコピーするだけであるために発生します。どちらも同じ実際のリストを参照しています。ab

上で試したように、リストのリストを作成するには、エントリごとに一意のリストを作成する必要があります。リスト内包表記はうまく機能します:

mainlist = [[1] for x in range(20)]
mainlist[0].append(2)
mainlist # [[1,2],[1],[1],...]

編集

余談ですが、Python では型名はメタクラスであるため、変数に型名を付けることはお勧めできません。その理由は、コードのさらに下でいくつかの問題が発生する可能性があるためです。

a = range(3) # [0,1,2]
type(a) # (type 'list')
isinstance(a, list) # True

次に、という名前の変数を作成しますlist

list = range(3)
list # [0,1,2]
isinstance(list, list)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: isinstance() arg 2 must be a class, type, or tuple of classes and types

言うまでもなく、今ではlist()演算子を使用できません

c = list((1,2,3))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'list' object is not callable
于 2013-03-19T22:44:22.240 に答える