2Dリストは、単一の値を変更しようとするときに奇妙なBehavorを持っています[複製
-
02-10-2019 - |
質問
可能な複製:
リストのPythonリストの予期しない機能
したがって、私はPythonに比較的初めてであり、2Dリストで作業するのに苦労しています。
これが私のコードです:
data = [[None]*5]*5
data[0][0] = 'Cell A1'
print data
そして、ここに出力があります(読みやすさのためにフォーマットされています):
[['Cell A1', None, None, None, None],
['Cell A1', None, None, None, None],
['Cell A1', None, None, None, None],
['Cell A1', None, None, None, None],
['Cell A1', None, None, None, None]]
なぜすべての行に値が割り当てられるのですか?
解決
これにより、5つの参照があるリストが作成されます 同じ リスト:
data = [[None]*5]*5
代わりにこのようなものを使用して、5つの別々のリストを作成します。
>>> data = [[None]*5 for _ in range(5)]
今、それはあなたが期待することをします:
>>> data[0][0] = 'Cell A1'
>>> print data
[['Cell A1', None, None, None, None],
[None, None, None, None, None],
[None, None, None, None, None],
[None, None, None, None, None],
[None, None, None, None, None]]
他のヒント
として シーケンスタイプのPythonライブラリリファレンス, 、リストを含む、と言います
また、コピーは浅いことに注意してください。ネストされた構造はコピーされていません。これはしばしば新しいPythonプログラマーに出没します。検討:
>>> lists = [[]] * 3
>>> lists
[[], [], []]
>>> lists[0].append(3)
>>> lists
[[3], [3], [3]]
起こったのは、[[]]は空のリストを含む1つの要素リストであるため、[] * 3の3つの要素はすべて、この単一の空のリストです。リストの要素のいずれかを変更すると、この単一のリストが変更されます。
この方法で、さまざまなリストのリストを作成できます。
>>> lists = [[] for i in range(3)]
>>> lists[0].append(3)
>>> lists[1].append(5)
>>> lists[2].append(7)
>>> lists
[[3], [5], [7]]
Pythonでは、すべての変数がオブジェクトであるため、参照です。最初に5つのNonesの配列を作成し、次に同じオブジェクトの5倍の配列を作成します。
所属していません StackOverflow