似乎有些东西卡在记忆中

时间:2016-02-24 16:49:13

标签: python memory

我有一个程序循环遍历列表,然后在列表上执行一个函数。从函数返回的结果是不同的,这取决于我是否循环几个观察而不是一个。例如,当我单独进行第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中的所有变量都不应该从内存中清除掉吗?有什么我想念的吗?

2 个答案:

答案 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__

中的