需要帮助了解此递归函数如何工作

sqr*_*ram 2 python recursion

这是一个功能(归功于用户Abbot,用于在另一个问题中提供)

def traverse(ftp):

    level = {}
    for entry in (path for path in ftp.nlst() if path not in ('.', '..')):
        ftp.cwd(entry)
        level[entry] = traverse(ftp) 
        ftp.cwd('..')
    return level
Run Code Online (Sandbox Code Playgroud)

这是我不明白的:当python进入函数时,它会创建一个空字典(level).在for循环中,它将目录名称存储为字典中的键.至于那个键的值,python再次进入函数并搜索一个目录,它就变成了该键的值.

但是,级别字典如何记住内部的值?我的意思是,每次python进入函数时都不应该重置/清空吗?

bad*_*adp 7

不.该函数的每个"实例"都有自己的副本,level并且各个副本之间没有副作用level.

拿这个文件夹树:

root
 `-home
    |- lyrae
    |   |- ftp.py
    |   `- http.py
    `- badp
Run Code Online (Sandbox Code Playgroud)

下面是当你调用(简体)执行流程ftproot:

  • ftp(root)创建一个空level字典
  • ftp(root)枚举子文件夹:(home).
  • ftp(root) 选择第一个子文件夹并将目录更改为其中.
  • ftp(root)设置level[home]ftp当前文件夹中的结果.

  • ftp(home)创建一个空level字典
  • ftp(home)枚举子文件夹:(lyrae, badp).
  • ftp(home) 选择第一个子文件夹并将目录更改为其中.
  • ftp(home)设置level[lyrae]ftp当前文件夹中的结果.

  • ftp(lyrae)创建一个空level字典
  • ftp(lyrae)枚举子文件夹:().
  • ftp(lyrae)超出子文件夹解析并返回level.

  • ftp(home) 完成任务: levels = {'lyrae': {}}
  • ftp(home) 更改到下一个文件夹.
  • ftp(home)设置level[badp]ftp当前文件夹中的结果.

  • ftp(badp)创建一个空level字典
  • ftp(badp)枚举子文件夹:().
  • ftp(badp)超出子文件夹解析并返回level.

  • ftp(home) 完成任务: levels = {'lyrae': {}, 'badp': {}}
  • ftp(home)超出子文件夹解析并返回level.

  • ftp(root) 完成任务: levels = {'home': {'lyrae': {}, 'badp': {}}}
  • ftp(root)超出子文件夹解析并返回level.