Существует два распространенных способа решения вашей проблемы: передача списков в качестве параметров и объединение возвращаемых значений из рекурсивных вызовов.
Вот как можно передать списки в качестве параметров.Мы создаем функцию-обертку, чтобы скрыть детали реализации.
def print_diff_files(dcmp):
"""calls the wrapper to do the real work. Hides the list management."""
left = []
right = []
_print_diff_files_impl(dcmp, left, right)
return left, right
def _print_diff_files_impl(dcmp, diff_leftpath_list, diff_rightpath_list):
for name in dcmp.diff_files:
print("[Differing File] '%s' found in %s and %s" % (name, dcmp.left,
dcmp.right))
diff_leftpath = os.path.join(dcmp.left, name)
diff_rightpath = os.path.join(dcmp.right, name)
diff_leftpath_list.append(diff_leftpath)
diff_rightpath_list.append(diff_rightpath)
for sub_dcmp in dcmp.subdirs.values():
_print_diff_files_impl(sub_dcmp, diff_leftpath_list, diff_rightpath_list)
Вот как вы можете управлять ей с помощью возвращаемых значений.Обычно это лучший подход.
def print_diff_files(dcmp):
left = []
right = []
for name in dcmp.diff_files:
print("[Differing File] '%s' found in %s and %s" %
(name, dcmp.left, dcmp.right))
diff_leftpath = os.path.join(dcmp.left, name)
diff_rightpath = os.path.join(dcmp.right, name)
left.append(diff_leftpath)
right.append(diff_rightpath)
for sub_dcmp in dcmp.subdirs.values():
new_left, new_right = print_diff_files(sub_dcmp)
left.extend(new_left)
right.extend(new_right)
return left, right
Если вы хотите стать более изобретательным, вы можете использовать генераторы, но это немного большее изменение в вашем коде.