Python对象成员表现为静态,即使它们不是静态的(我知道)

时间:2015-07-16 22:20:41

标签: python-3.x scope instance non-static defaultdict

我创建了一类用于保存数据的对象。该类的每个实例都作为项存储在字典中。当我使用类中的 init 方法实例化每个实例时,使用self.member = ____设置的成员是唯一的,因为它们应该是唯一的。但是,当我稍后访问字典中的实例时,如果我更改该实例中的任何内容,则更改由于某种原因应用于所有存储在字典中的实例,这是我不想要的。例如,如果我添加到set()的{​​{1}}成员,则如下所示:

mydict['A']

然后更改也会出现在mydict [' B']中。具体来说,如果我说:

mydict['A'].myset.add('a')

印刷品是什么:

mydict['B'].myset.add('b')
print(mydict['B'].myset)

尽管我从未将{'a', 'b'} 添加到'a'。实例,(在这个例子中,mydict [' A']和mydict [' B'],但在现实生活中更多)在我试图改变之前被实例化和打印他们;在更改之前,它们出现以独立存在。使用self.member = _____定义所有成员,并且我尝试替换成员的显式更改,例如

mydict['B']

内部更改成员的方法,例如

mydict['A'].myset.add('b')

但即使这些尝试也没有解决上述问题。以下是所有感兴趣的代码的简化版本。提前感谢您的帮助,我真的很感激。我对Python有点新鲜,这个问题让我摸不着头脑。我猜测我缺少一些模糊的特定于Python的范围规则(因为Python有一种不寻常的方法来处理将对象传入和传出方法),但我一直无法做到这一点。找到解决方案。

def addtoset(self, x):
  self.myset.add(x)

为我打印的内容将是:

class mydata:
  def __init__(self, myset = set()):
    self.myset = myset
  def addtoset(self, x):
    self.myset.add(x)
class mymethods:
  def update(datadict):
    count = 0
    for md in datadict:
      datadict[md].addtoset(count)
      print(datadict[md].myset)
      count = count+1
if __name__ == '__main__':
  keys = ['A','B','C']
  datadict = defaultdict(mydata)
  for key in keys:
    datadict[key] = mydata()
  mymethods.update(datadict)

尽管事实上我似乎只为每个实例添加了一个项目。发生了什么,我怎么能阻止这个? (我不希望每个实例都有联合集)。另请注意,我使用的是Python 3。

1 个答案:

答案 0 :(得分:1)

我的一位朋友能够回答我的问题。正如所料,这是一个古怪的范围。该链接Python Writing Gotchas

清楚地解释了问题和解决方案

显然__init__(self, x=set())在首次创建方法(在本例中为set())时初始化__init__,因此x的每个实例都会引用类似静态实例的内容而不是自己的实例新实例。要解决此问题,您必须初始化内部方法。您可以默认为None,然后使用条件来执行此操作(请参阅链接)。