实例变量意外更改

时间:2014-08-27 22:43:12

标签: python oop recursion instance-variables self

尝试通过目录递归来查找不在orig和dest目录中的文件。当我递归到目录中时,我传递一个先前的目录变量,以便我知道源目录中的工作目录结构(因为工作目录在orig和amp; dest目录上都匹配)。

如果我的第一个工作目录是'dirA',则变量self.working变为'dirA'。如果我进入'dirA / dirB'并将self.working传递给recurse方法,那么(我认为是新的实例)变量working变为< EM> 'DIRA / DIRB'的。当它在'dirB'中完成并返回'dirA'时,self.working仍然是'dirA / dirB'

如果我只是将self.working移开,一切都按预期工作(因为working现在是一个静态变量?)。当我调用self.recurse时,这会创建一个新的recurse实例吗?我也将一个新列表作为实例变量传递,但没有任何奇怪的事情发生。

我想跟进的问题是:我应该何时明确声明实例变量,何时应该接受使用该方法传入的变量?

以下是无效的代码的简化版本。我已经拿出了所有其他的东西,因为这是我唯一的问题,其余的不影响这一部分。我正在创建'dirA'&amp; 'dirB'列在if子句中,因为在实际代码中我创建了当前目录内容的列表。

source = 'dirS/'
c_SD_list = ['dirA', 'fileA']

class checkFiles(object):
    def __init__(self, source):
        self.source = source

    def recurse(self, current_list, working):
        self.current_list = current_list
        self.working = working
        for a in self.current_list:
            self.full = self.working + a
            if a == 'dirA':
                self.new_list = ['dirB', 'fileA_1', 'fileA_2']
                self.recurse(self.new_list, self.full + '/')
            elif a == 'dirB':
                self.new_list = ['fileB_1', 'fileB_2']
                self.recurse(self.new_list, self.full + '/')
            else:
                print(self.source + self.full)

checker = checkFiles(source)
checker.recurse(c_SD_list, '')

我用Google搜索了半天,在这里阅读旧问题,描述实例变量的文档和帖子,一般的OOP等等......仍然无法理解为什么会发生这种情况。因此,如果我错过了某人已经提出的答案,请原谅我,并请他们指出。谢谢!

1 个答案:

答案 0 :(得分:0)

Callling self.recurse()不会创建任何新对象,因此self.current_list将指向同一个对象。

如果您想在递归时制作新物品,请尝试checkFiles(self.source).recurse()

编辑: 回答您的后续问题:

如果它们反映了该对象的某些质量,而不是某些函数的状态,那么您应该只创建实例变量。作为个人风格的笔记,你通常不应该在构造函数之外创建它们,但这取决于个人品味。