Пытается рекурсивно пройти через каталоги, чтобы найти файлы, которые не находятся в каталогах источника и dest. Когда я переписываю каталоги, я передаю предыдущую переменную каталога, чтобы я знал структуру рабочего каталога в исходном каталоге (потому что рабочие каталоги совпадают как с каталогами 0 & dest).переменная экземпляра неожиданно изменяется
Если мой первый рабочий каталог «Дира», то переменная self.working
становится «Дира». Если я перейду в 'dirA/dirB' и пройдите self.working
назад к методу recurse, то (что я думаю, это новый экземпляр) переменная working
становится 'dirA/dirB'. Когда это делается в 'dirB' и возвращается к 'dirA', self.working
по-прежнему 'dirA/dirB'.
Если я просто принимаю self.
от working
, все работает как ожидается (потому что working
теперь является статической переменной?). Когда я звоню self.recurse
, это действительно создает новый экземпляр recurse правильно? Я также передаю новый список как переменную экземпляра, но с этим ничего странного.
Я предполагаю, что следующий вопрос будет следующим: когда я должен явным образом объявлять переменные экземпляра, и когда я должен просто принимать переменные, которые передаются с помощью метода?
Это рационализированная версия кода, который не работал. Я вытащил все остальные вещи, потому что это единственная проблема, с которой я связан, а остальная часть не влияет на эту часть. Я создаю 'dirA' & '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, '')
Я гугл в течение половины дня, читал старые вопросы здесь, документы и сообщения, описывающие переменный экземпляр, ООП в целом, и т.д ... до сих пор не в состоянии понять, почему это происходит. Поэтому, если я пропустил ответ, который кто-то уже положил, пожалуйста, простите меня и любезно укажите на него. Благодаря!
'self.working' не изменяется, поскольку он поднимается по дереву, потому что он все еще указывает на тот же объект. Если вы хотите, чтобы работа оставалась между вызовами, не используйте ее как атрибут экземпляра, а только локальную переменную. – user2085282
А, это имеет смысл. Благодаря! Еще один вопрос, почему вы предлагаете не создавать переменные экземпляра вне конструктора? – ben
Nevermind, я использовал свой мозг и googled. – ben