Python 正在意外更改实例变量
尝试在目录中递归以查找不在orig和dest目录中的文件。当我递归到目录中时,我会传递上一个目录变量,以便知道源目录中的工作目录结构(因为工作目录在orig和dest目录上都匹配) 如果我的第一个工作目录是“dirA”,那么变量Python 正在意外更改实例变量,python,oop,recursion,instance-variables,self,Python,Oop,Recursion,Instance Variables,Self,尝试在目录中递归以查找不在orig和dest目录中的文件。当我递归到目录中时,我会传递上一个目录变量,以便知道源目录中的工作目录结构(因为工作目录在orig和dest目录上都匹配) 如果我的第一个工作目录是“dirA”,那么变量self.working将变为“dirA”。如果我进入'dirA/dirB'并将self.working返回到recurse方法,那么变量working将成为'dirA/dirB'。当它在“dirB”中完成并返回到“dirA”时,self.working仍然是“dirA/
self.working
将变为“dirA”。如果我进入'dirA/dirB'并将self.working
返回到recurse方法,那么变量working
将成为'dirA/dirB'。当它在“dirB”中完成并返回到“dirA”时,self.working
仍然是“dirA/dirB”
如果我只是把self.
从工作中去掉,那么一切都会按预期工作(因为工作
现在是一个静态变量?)。当我调用self.recurse
时,会创建一个新的recurse实例,对吗?我还将传递一个新的列表作为实例变量,但没有什么奇怪的事情发生
我想接下来的问题是:什么时候应该显式声明实例变量,什么时候应该只接收随方法传入的变量
这里是一个简化版本的代码,但它不起作用。我已经取出了所有其他的东西,因为这是我唯一的问题,其余的都不会影响这部分。我在if
子句中创建“dirA”和“dirB”列表,因为在实际代码中,我在那里创建了当前目录内容的列表
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, '')
我在谷歌上搜索了半天,阅读了关于这里的老问题、描述实例变量的文档和帖子、OOP的一般内容等等。。。我仍然无法理解为什么会发生这种情况。因此,如果我错过了别人已经给出的答案,请原谅我并指出它。谢谢 调用self.recurse()
不会创建任何新对象,因此self.current\u list
将指向同一对象
如果要在递归时创建新对象,请尝试checkFiles(self.source).recurse()
编辑:
针对您的后续问题:
只有当实例变量反映对象的某些质量,而不是某个函数的状态时,才应该创建实例变量。作为个人风格的说明,通常不应该在构造函数之外创建它们,但这取决于个人品味。self。工作在树上时不会发生变化,因为它仍然指向同一个对象。如果你想在两次调用之间保持工作状态,不要把它作为一个实例属性,而只是一个局部变量。啊,这很有意义。谢谢还有一个问题,为什么不建议在构造函数之外创建实例变量?