我写代码以递归方式列出所有具有层次结构的目录和文件。code1和code2之间只有一个区别,即“import os”的位置。
代码1:
def recur_dir(dn,level=0,result=[]):
import os
new_queue=[]
if level==0:
dn=[dn]
for item in dn:
result.append([level,item])
if os.path.isdir(item):
for next_item in os.listdir(item):
next_dn = os.path.join(item, next_item)
new_queue.append(next_dn)
level=level+1
if len(dn)>0: recur_dir(new_queue,level,result)
return result
>>> z=recur_dir("/home/jack",0,[])
>>> z
[[0, '/home/jack'], [1, '/home/jack/.ssh'], [1, '/home/jack/.profile'], [1, '/home/jack/.bashrc'], [1, '/home/jack/wp.sh'], [1, '/home/jack/.bash_history'], [1, '/home/jack/.bash_logout'], [2, '/home/jack/.ssh/known_hosts']]
我想让 'import os' 在运行过程中只被调用一次,将 code1 更改为 code2。
代码 2:
def recur_dir(dn,level=0,result=[]):
new_queue=[]
if level==0:
dn=[dn]
import os
for item in dn:
result.append([level,item])
if os.path.isdir(item):
for next_item in os.listdir(item):
next_dn = os.path.join(item, next_item)
new_queue.append(next_dn)
level=level+1
if len(dn)>0: recur_dir(new_queue,level,result)
return result
>>> y=recur_dir("/home/jack",0,[])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 14, in recur_dir
File "<stdin>", line 9, in recur_dir
UnboundLocalError: local variable 'os' referenced before assignment
请告诉我代码背后的原因。
最佳答案
注意回溯错误信息中:
Traceback (most recent call last):
File "/home/unutbu/pybin/script.py", line 21, in <module>
recur_dir('/tmp', 0, [])
File "/home/unutbu/pybin/script.py", line 18, in recur_dir
if len(dn)>0: recur_dir(new_queue,level,result) <- RECUR_DIR IS CALLED
File "/home/unutbu/pybin/script.py", line 13, in recur_dir
if os.path.isdir(item):
UnboundLocalError: local variable 'os' referenced before assignment
直到之后
错误才会发生if len(dn)>0: recur_dir(new_queue,level,result)
达到了。换句话说,UnboundLocalError
是在
第二次 调用 recur_dir
,当 level
不再等于零时。
请记住,通过在 recur_dir
中使用 import os
,os
被定义为一个局部变量。它只存在于函数范围内。第二次递归调用recur_dir
时,没有定义os
。因此在第 13 行遇到 os
时出现 UnboundLocalError。
关于python - 相同的语句不同的位置导致不同的结果 : local variable "os" referenced before assignment,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28794776/