python - 相同的语句不同的位置导致不同的结果 : local variable "os" referenced before assignment

标签 python recursion

我写代码以递归方式列出所有具有层次结构的目录和文件。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 osos 被定义为一个局部变量。它只存在于函数范围内。第二次递归调用recur_dir时,没有定义os。因此在第 13 行遇到 os 时出现 UnboundLocalError。

关于python - 相同的语句不同的位置导致不同的结果 : local variable "os" referenced before assignment,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28794776/

相关文章:

python - 在 OpenCV Grabcut python 中同时使用 rect 和 mask

algorithm - 如何以最有效的方式计算出利润最密集的组合?

java - 将递归方法更改为迭代方法

Groovy 2.1.9 中的闭包递归

javascript - 数组中深度嵌套的对象

python - gc 上的段错误,使用 ctypes

python - 无法使用 python 将 UDP 数据包发送到本地端口,根据 WireShark 校验和失败

python - 使用 numpy 来减小矩阵的大小

python - 使用子字符串进行列表切片

arrays - 细菌数量玻璃覆盖率