2

重複の可能性:
サブリストに追加すべてのサブリストに追加

2Dリストは次のように初期化されますgrid=[[False]*N] *N

印刷グリッドは以下を生成します:

[[False, False, False, False], [False, False, False, False], [False, False, False, False], [False, False, False, False]]

ここで、行1と列1の要素をtrueにします。行1と列1の要素のみをtrueにしたい。他の要素はfalseでなければなりません。

grid[0][0]=True

grid [0] [0]をtrueに設定した後、printgridは以下を生成します。

[[True, False, False, False], [True, False, False, False], [True, False, False, False], [True, False, False, False]]

しかし、すべての行の最初の要素はTrueになりましたが、最初の行の最初の要素のみをTrueにしたいのです。

助けてください。私はPythonを初めて使用します。

4

2 に答える 2

3

単一の参照データ型を乗算すると、同じ型の複数の参照が作成されるだけです。つまり、[True]*Nは実際には要素[True]の同じインスタンスのN倍です。

したがって、1つを変更すると、他の人が誤って変更されます

次の例でわかるように、

>>> grid = [[True]]*10
>>> grid = [True]*10
>>> [id(e) for e in grid]
[505379788, 505379788, 505379788, 505379788, 505379788, 505379788, 505379788, 505379788, 505379788, 505379788]

これは、すべての要素が実際には同じインスタンスであることを示しています。

ただし、ここでは要素が変更可能なタイプではないため、変更はここでは問題になりません。要素の1つを変更すると、新しいインスタンスが割り当てられるだけです。

可変型で問題が発生する

>>> [id(e) for e in grid]
[66523744, 66523744, 66523744, 66523744, 66523744, 66523744, 66523744, 66523744, 66523744, 66523744]
>>> grid[0][0]=False
>>> [id(e) for e in grid]
[66523744, 66523744, 66523744, 66523744, 66523744, 66523744, 66523744, 66523744, 66523744, 66523744]
>>> grid
[[False], [False], [False], [False], [False], [False], [False], [False], [False], [False]]

それを乗り越えるには、どれが可変タイプであるかを理解し、それを複製するのを控え、代わりに同じ可変タイプの新しい複数のインスタンスを作成する必要があります

したがって、ここではリストは変更可能なタイプであるため、おそらくリスト内包表記を使用して、複数のインスタンスを作成する必要があります。

[[False]*N for _ in range(N)]
于 2013-01-07T06:00:14.957 に答える
2

この質問と同じように、あなたのリストは実際には同じリストを指しています。代わりに、リストを次のように定義します。

[[False] * N for i in xrange(N)]

またはPython3:

[[False] * N for i in range(N)]

次に、1つの要素を変更すると、その要素のみが変更されます。

Python3関数はPython2でも機能することに注意してください。rangeただし、Python 2では、range関数はリストを返しますrange。Python3のオブジェクト、およびxrangePython 2のオブジェクトは、どちらもイテレーターです。

于 2013-01-07T05:59:52.080 に答える