这是一个功能(归功于用户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进入函数时都不应该重置/清空吗?
不.该函数的每个"实例"都有自己的副本,level
并且各个副本之间没有副作用level
.
拿这个文件夹树:
root
`-home
|- lyrae
| |- ftp.py
| `- http.py
`- badp
Run Code Online (Sandbox Code Playgroud)
下面是当你调用(简体)执行流程ftp
上root
:
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
.