1

重複の可能性:
二重ループに関する単純なPythonコード

リストのリストで1つのアイテムを変更するというよく知られた問題に悩まされています。リストの固定サイズのリストを使用する必要があります。

私が使用する場合:

In [21]: a=[[2]*2]*3

In [22]: a
Out[22]: [[2, 2], [2, 2], [2, 2]]

In [23]: a[0][0]=1

In [24]: a
Out[24]: [[1, 2], [1, 2], [1, 2]]

しかし、リストのリストを次のように定義すると、機能します。

In [26]: a = [
   ....: [2,2],
   ....: [2,2],
   ....: [2,2],
   ....: ]

In [27]: a   
Out[27]: [[2, 2], [2, 2], [2, 2]]

In [28]: a[0][0]=1

In [29]: a
Out[29]: [[1, 2], [2, 2], [2, 2]]

私には22行目と27行目は同じように見えます。では、どちらが違いますか?

誰かがこの問題を回避する方法、特にリストのリストの単一の項目を変更するコードを変更する方法を教えてもらえますか?これが不可能な場合、それを可能にする別のデータ構造に移動するための提案はありますか?ありがとう

4

1 に答える 1

0

両方のコードサンプルでマトリックスを定義した2つの方法には根本的な違いがあります。最初の(21行目)で、外側のリストに3を掛けると、実際には内側のリストへの参照が掛けられます。

パラメータ化された例を次に示します。

a = [2,2]
b = [a] * 3
b => [a, a, a] => [[2,2], [2,2], [2,2]]

ご覧のとおり、の数値表現bは期待どおりですが、実際には。への3つの参照が含まれていますa。したがって、内部リストのいずれかを変更すると、実際には同じリストであるため、すべてが変更されます。

乗算の代わりに、次のようなことを行うリストのクローンを作成する必要があります

new_list = old_list[:]

また

new_list = list(old_list)

ネストされたリストの場合、これはループを使用して実行できます。

于 2012-09-02T15:58:00.560 に答える