尽管全局密钥,Python“赋值前引用的局部变量”出错

时间:2014-01-03 14:49:57

标签: python variables global local

这是我的问题:

savedFileSize = 0
savedFileCount = 0
SUBFOLDER = False

def saveFile(path, filename):
    global savedFileSize
    global savedFileCount

    filepath = os.path.join(path, filename)
    if SUBFOLDER:
        try:
            subpath = os.path.join(SAVEPATH, path.split("\\", 1)[1])
            if not os.path.exists(subpath):
                os.makedirs(subpath)
            shutil.copy(filepath, subpath)
            savedFileCount += 1
            savedFileSize += os.path.getsize(filepath)/(1024*1024)
        except BaseException as e:
            logging.exception(e)
    else:
        try:
            shutil.copy(filepath, SAVEPATH)
            savedFileCount += 1
            savedFileSize += os.path.getsize(filepath)/(1024*1024)
        except BaseException as e:
            logging.exception(e)

我在分配之前得到了“局部变量'savedFileCount'”,整个时间都是错误的。 但变量SUBFOLDER没有任何问题。 saveFileSize变量也可以正常工作。

1 个答案:

答案 0 :(得分:1)

我很高兴删除你的pyc文件解决了你的问题。但是,您的代码实际上并没有调用全局变量。在大多数情况下,(可避免的)使用全局变量表示设计不太好,可能会导致各种问题,包括姓名冲突等。

您可以轻松地重构您的代码而不使用全局变量:

def saveFile(path, filename):
    savedFileCount, savedFileSize = 0, 0
    filepath = os.path.join(path, filename)
    if SUBFOLDER:
        try:
            subpath = os.path.join(SAVEPATH, path.split("\\", 1)[1])
            if not os.path.exists(subpath):
                os.makedirs(subpath)
            shutil.copy(filepath, subpath)
            savedFileCount = 1
            savedFileSize = os.path.getsize(filepath)/(1024*1024)
        except BaseException as e:
            logging.exception(e)
    else:
        try:
            shutil.copy(filepath, SAVEPATH)
            savedFileCount = 1
            savedFileSize += os.path.getsize(filepath)/(1024*1024)
        except BaseException as e:
            logging.exception(e)
    return savedFileCount, savedFileSize

然后在你的通话范围内:

totalCount, totalSize = 0
for path, filename in tobesaved:
    count, size = saveFile(path, filename)
    totalCount += count
    totalSize += size