0

コードを読みやすくするために、独自のデータ クラスを作成したいと考えています。Myclass問題は、クラス (例: ) をリストに適用すると、予期しない結果が得られることです。具体的には、リストの個々のメンバーに対して計算を実行すると、すべてのメンバーが 1 つの変数として扱われます。この場合の結果は、すべてのメンバーの合計に等しくなります。次の例を考えてみましょう。

#!/usr/bin/env python

# create a simple class
class Myclass:

  def __init__(self,mem):
    self.mem = mem
  def __repr__(self):
    return '%d'%self.mem

# simple program: each list item should be unique
if __name__=='__main__':

  # initate array
  nlst = 3
  dlst = [Myclass(0)]*nlst
  ilst = [0]*nlst


  # generate example data
  for i in range(nlst):
    for j in range(nlst)[i:]:
      dlst[i].mem += (i+j)
      ilst[i] += (i+j)

  print 'dlst = ',dlst
  print 'ilst = ',ilst

この例では、リストdlst(長さnlst = 3) が開始されます。メンバーのタイプは であり、Myclassゼロから開始されます。次に、単純な加算がループで実行されます。参照として、整数のリストが含まれています ( ilst)。この例の結果は次のようになります。

ilst = [3, 5, 4]

しかし、型のメンバーのリストの場合Myclass、結果は

dlst = [12, 12, 12]

つまり、それらは同じ変数のように見え、その値はリストの個々のメンバーの合計です。

助けてください。

4

2 に答える 2

4

インスタンスを1 つ作成してから、そのインスタンスへの参照をコピーしますnlst

dlst = [Myclass(0)]*nlst

これは;のnlistインスタンスのリストを作成しません。すべてが 1 つのオブジェクトを指している参照Myclass(0)のリストを作成します。nlst

代わりにリスト内包表記を使用してください。

dlst = [Myclass(0) for _ in range(nlst)]

リスト内包表記では、左側の式がループの反復ごとに再実行されます。

于 2013-08-10T16:54:26.657 に答える
1

変更してみてください:

dlst = [Myclass(0)]*nlst

に:

dlst = [Myclass(0) for i in range(nlst)]
于 2013-08-10T16:55:42.603 に答える