我创建了一类用于保存数据的对象。该类的每个实例都作为项存储在字典中。当我使用类中的 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。
答案 0 :(得分:1)
我的一位朋友能够回答我的问题。正如所料,这是一个古怪的范围。该链接Python Writing Gotchas
清楚地解释了问题和解决方案显然__init__(self, x=set())
在首次创建方法(在本例中为set()
)时初始化__init__
,因此x的每个实例都会引用类似静态实例的内容而不是自己的实例新实例。要解决此问题,您必须初始化内部方法。您可以默认为None,然后使用条件来执行此操作(请参阅链接)。