首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > perl python >

关于python中函数以及全局变量的有关问题

2013-09-06 
关于python中函数以及全局变量的问题在使用python写递归函数时,想要使用函数外部的一个变量而且在函数内会

关于python中函数以及全局变量的问题
在使用python写递归函数时,想要使用函数外部的一个变量

而且在函数内会一直改变这个变量

应该如何定义这个变量

使用了global貌似也不行

下面贴上我的代码以及报的错

代码:

import os
global cur_dir
cur_dir = os.getcwd()

def delete(dir):
    list = os.listdir(dir)
    for i in range(len(list)):
        if os.path.isdir(cur_dir+"\"+list[i]) == Ture:
            if os.listdir(cur_dir+"\"+list[i]) == []:
                os.rmdir(cur_dir+"\"+list[i])
            else:
                cur_dir = cur_dir+"\"+list[i]
                delete(cur_dir)
c_dir = os.getcwd()
delete(c_dir)
print("删除成功")
input("按任意键退出")


下面是报的错

Traceback (most recent call last):
  File "C:\Users\Administrator\Desktop\新建文件夹\del.py", line 20, in <module>
    delete(c_dir)
  File "C:\Users\Administrator\Desktop\新建文件夹\del.py", line 13, in delete
    if os.path.isdir(cur_dir+"\"+list[i]) == Ture:
UnboundLocalError: local variable 'cur_dir' referenced before assignment

求各位高手帮忙解答

[解决办法]
代码有两个问题:
1. 全局变量名称必须全部大写
2. 第8行“Ture”拼错了,应该是“True”

import os
global CUR_DIR
CUR_DIR = os.getcwd()
 
def delete(dir):
    list = os.listdir(dir)
    for i in range(len(list)):
        if os.path.isdir(CUR_DIR+"\"+list[i]) == True:
            if os.listdir(CUR_DIR+"\"+list[i]) == []:
                os.rmdir(CUR_DIR+"\"+list[i])


            else:
                cur_dir = CUR_DIR+"\"+list[i]
                delete(CUR_DIR)
c_dir = os.getcwd()
delete(c_dir)
print("删除成功")
input("按任意键退出")


[解决办法]
global cur_dir应放到函数中。

def delete(dir):
    global cur_dir
    ....


另外,rmdir是很危险的操作,调试程序时建议用print代替它。
dir,list都是python内置的函数名,最好避免用它做自己的变量名。
用os.join(dirname, filename)代替dirname+'\\'+filename,可以自动适应操作系统的不同。
用for item in itemlist, 不用for i in range(len(itemlist))...
cur_dir的作用可以通过参数实现,不需要全局变量。
最后,python有os.walk函数帮助实现遍历文件系统。


 # coding=utf-8
import os

def delete_empty_dir(dirname):
    filelist = os.listdir(dirname)
    for entry in filelist:
        next_entry = os.path.join(dirname, entry)
        if os.path.isdir(next_entry): # 不需要 ==True
            if os.listdir(next_entry) == []:
                print "delete:", next_entry
            else:
                delete_empty_dir(next_entry)
c_dir = os.getcwd()
printdir(c_dir)
print u"删除成功"
input(u"按任意键退出")


[解决办法]
python支持对列表(以及其他可遍历的结构)直接循环,不用对下标循环,再在循环体中用下标取元素。看你的学习资料的关于循环的部分,应该讲这个了。
[解决办法]
关于for循环:
例子中的list可以换成任何可iterable的结构。
>>> list = ['a', 'b', 'c', 'd']
>>> for item in list:
... print(item)
... 
a
b
c
d
>>> 

热点排行