Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 正在意外更改实例变量_Python_Oop_Recursion_Instance Variables_Self - Fatal编程技术网

Python 正在意外更改实例变量

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/

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

如果我的第一个工作目录是“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。工作在树上时不会发生变化,因为它仍然指向同一个对象。如果你想在两次调用之间保持工作状态,不要把它作为一个实例属性,而只是一个局部变量。啊,这很有意义。谢谢还有一个问题,为什么不建议在构造函数之外创建实例变量?