0

我想创建自己的数据类以使代码更具可读性。Myclass问题是当在列表中应用类(例如)时,我得到了意想不到的结果。特别是当我对列表中的单个成员执行计算时,所有成员都被视为一个变量;在这种情况下,结果等于所有成员的总和。考虑以下示例。

#!/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

您正在创建一个实例,然后将引用复制到该实例nlst时间:

dlst = [Myclass(0)]*nlst

这不会创建 ; 的nlist实例列表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 回答