0

Pythonでネストされたリストがあります。2 番目のリストの各項目もネストされたリストです。私の目標は、1 つのリストを複製し、同じインデックスに挿入してから、それぞれを変更することです。したがって、開始条件の例:

 myList = [[first_list], [[element_1], [element_2, element_3], [duplicate_me]]]

myList[1][2] での複製/挿入:

 myList = [[first_list], [[element_1], [element_2, element_3], [duplicate_me], [duplicate_me]]]

これはすべてうまくいきます。ただし、追加コードを実行すると:

 myList[1][2].append(new_element)

次のように、両方の複製に新しい要素を追加します。

 myList = [[first_list], [[element_1], [element_2, element_3], [duplicate_me, new_element], [duplicate_me, new_element]]]

要素が呼び出されたり、インデックスが作成されたりする方法で何か奇妙なことが起こっていますか? 潜在的な回避策 (アイテムを作業変数に複製するように呼び出し、そこで変更し、同じポイントに挿入する) が考えられますが、それは不必要に複雑に思えます。

ありがとう!

4

2 に答える 2

3

myList[1][2] と myList[1][3] は同じ値を持っているだけでなく、実際には同じリストです。両方を読むと、メモリ内の同じ領域を見ています。したがって、一方を変更すると、もう一方も変更されます。これは、どちらも実際にはまったく同じものだからです。リストを複製する代わりに、リストのコピーを作成する必要があります。

Python シェルの問題の例を次に示します。

>>> mylist = [1, 2, 3]
>>> newlist = mylist
>>> newlist.append(4)
>>> newlist
[1, 2, 3, 4]
>>> mylist
[1, 2, 3, 4]

これを修正する一般的な方法は、次のトリックのいずれかを使用することです。

>>> mylist = [1, 2, 3]
>>> newlist = mylist[:]  # OR :
>>> newlist = [x for x in mylist]
>>> newlist.append(4)
>>> newlist
[1, 2, 3, 4]
>>> mylist
[1, 2, 3]

2 行目と 3 行目は、リストのコピーを作成します。2D リストをコピーする必要がある場合は、次のように 2 つを組み合わせる傾向があります。

>>> newlist = [x[:] for x in mylist]

これらのいずれかを使用して複製を作成すると、すべてが再びうまくいきます.

于 2013-04-14T17:26:17.893 に答える