2Dリストは、単一の値を変更しようとするときに奇妙なBehavorを持っています[複製

StackOverflow https://stackoverflow.com/questions/2739552

  •  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倍の配列を作成します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top