我有一个程序循环遍历列表,然后在列表上执行一个函数。从函数返回的结果是不同的,这取决于我是否循环几个观察而不是一个。例如,当我单独进行第10次观察时,我得到一个结果但是当我放入9和10并循环它们时,我得到了10个不同的答案。我唯一能想到的是有一些变量在存储中,执行9上的函数是剩下的,这导致10的不同之处。这是循环的代码:
for i, k in enumerate(Compobs):
print i+1, ' of ', len(Compobs)
print Compobs[i]
Compobs[i] = Filing(k[0],k[1])
Compobs
就是这样一个列表:
[['355300', '19990531'],[...],...]
函数Filing
来自我导入的另一个.py文件。它定义了一个新类Filing()
,并在每个观察中执行一系列函数,并最终返回一些输出。我对python很新,所以我在这里有点亏。我可以发布Filing.py代码,但这超过1000行代码。
这是Filing类和 init 。
class Filing(object):
cik =''
datadate=''
potentialpaths=[]
potential_files=[]
filingPath =''
filingType=''
reportPeriod=''
filingText=''
current_folder=''
compData=pd.Series()
potentialtablenumbers=[]
tables=[]
statementOfCashFlows=''
parsedstatementOfCashFlows=[]
denomination=''
cashFlowDictionary ={}
CFdataDictionary=OrderedDict()
CFsectionindex=pd.Series()
cfDataSeries=pd.Series()
cfMapping=pd.DataFrame()
compCFSeries=pd.Series()
cftablenumber=''
CompleteCF=pd.DataFrame()
def __init__(self,cik,datadate):
self.cik=cik
self.datadate=datadate
self.pydate=date(int(datadate[0:4]),int(datadate[4:6]),int(datadate[6:8]))
self.findpathstofiling()
self.selectfiling()
self.extractFilingType()
self.extractFilingText()
self.getCompData()
self.findPotentialStatementOfCashFlows()
self.findStatementOfCashFlows()
self.cleanUpCashFlowTable()
self.createCashFlowDictionary()
self.extractCFdataDictionary()
self.createCFdataSeries()
self.identifySections()
self.createMapping()
self.findOthers()
每次调用Filing.py中的所有变量都不应该从内存中清除掉吗?有什么我想念的吗?
答案 0 :(得分:2)
Filing
顶级定义的所有列表,词组和其他对象只有一个副本。即使您明确地将它们分配给实例,该副本也是共享的(如果您没有明确地分配它们,则它们将被继承)。关键是如果你在一个实例中修改它们,你可以在所有实例中修改它们。
如果您希望每个实例都有自己的副本,那么请完全删除顶级分配,而是在__init__
中分配对象的新实例。
换句话说,不要这样做:
class Foo(object):
x = []
def __init__(self):
self.x = x
相反,这样做:
class Foo(object):
def __init__(self):
self.x = []
然后每个实例都有自己的非共享副本x
。
答案 1 :(得分:0)
您将类数据成员定义为类属性,而不是对象属性。它们就像是C ++或Java类的静态数据成员。
要解决此问题,您无需在__init__
方法之上定义它们,而是在__init__
方法中定义它们。例如,而不是
tables = []
以上__init__
你应该:
self.tables = []
__init__
中的