UnboundLocalError:赋值之前引用的局部变量-除非不是?全球/本地范围问题

时间:2019-04-24 01:37:51

标签: python python-3.x scope

所以我知道这个问题经常被问到,但是我还没有找到与我所发生的事情完全相符的东西。

在我的程序(Python 3.7.1)中,我想在启动时定义程序的安装位置,以及要保存程序生成的文件的默认位置。在程序的稍后部分,我想再次显示这些变量,并为用户提供将默认位置更改为其他位置的选项。

所以我在全局范围内有以下代码:

import os

installedDirectory = os.getcwd()

os.chdir('C:\\Program Files')

workingDirectory = os.getcwd()

print ('Program install location = ' + installedDirectory)
print ('Working directory = ' + workingDirectory)

程序的上述部分工作正常,并给出以下结果:

  

程序安装位置=   C:\ Users \ Chuu \ AppData \ Local \ Programs \ Python \ Python37-32 \ Scripts   工作目录= C:\ Program Files

但是,在程序的后面,我在函数中调用了这些相同的变量,并为用户提供了更改变量workingDirectory的选项:

def hiimafunction():

    print ('')
    print ('Current program install location = ' + installedDirectory)
    print ('')
    print ('Current working directory where files are saved = ' + workingDirectory)
    print ('')
    print ('Where would you like files to be saved?')
    print ('')
    print ('Press 1 for the current program install location')
    print (r'Press 2 for the default startup location - C:\\Program Files')
    print ('Press 3 for a custom location')
    print ('')
    oliviahye = input()
    if oliviahye == ('1'):
        os.chdir(installedDirectory)
    elif oliviahye == ('2'):
        os.chdir('C:\\Program Files')
    elif oliviahye == ('3'):
        print ('')
        print ('Type a path where you would like to save files.')
        oliviahye = input()
        os.chdir(oliviahye)
    else:
        hiimafunction()

    workingDirectory = os.getcwd()

    print ('')
    print ('Current save location is now = ' + workingDirectory)

发生这种情况时,出现以下错误:

  

UnboundLocalError:之前引用的本地变量“ workingDirectory”   作业

尽管错误专门指向该行:

print ('Current working directory where files are saved = ' + workingDirectory)

...问题似乎出在函数中的这一行:

workingDirectory = os.getcwd()

如果我在函数中删除了这一行,就没有错误,但是程序当然不会执行它应该做的事情,即获取新分配的工作目录并将其分配给变量workingDirectory。我还可以给它一个新变量(例如,workingDirectory2),它不会崩溃,但是这样就破坏了使变量workingDirectory首先显示此数据的整个目的。我不明白为什么该行在全局范围内没有问题,但是当变量已经定义时,同一行会在函数内产生错误。

阅读此问题,并添加以下行:

global workingDirectory

进入程序的第一部分应该会有所帮助,因为它应该停止程序在本地创建另一个具有相同名称的变量,但是由于产生相同的错误,它似乎没有任何作用。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

如果您在函数中为任何地方分配名称​​ ,则该名称对于 entire 函数是本地的。

因此,因为您有一行:

workingDirectory = os.getcwd()

在函数中更进一步,是否存在名为workingDirectory的全局变量无关紧要;当您尝试这样做时:

print ('Current working directory where files are saved = ' + workingDirectory)

它检查为该名称保留的本地语言中的插槽,发现它为空,并引发错误。

如果您要专门使用全局名称(因此在分配时,全局名称已更改),请添加:

global workingDirectory

位于函数顶部(在函数内部 ,但在函数中所有其他代码之前),并确保workingDirectory被赋予 some 值全局调用该函数之前(例如,在顶层分配workingDirectory = "Uninitialized"),或者在使用该函数之前在函数内部(例如,在使用该函数的workingDirectory之前将分配移至print它)。

如果您想print全局变量,但随后存储该值而不更改它,请为本地范围版本使用一个不同的名称,并且 only 读取全局变量(您不在这种情况下,不需要显式声明global;只要您从不分配它,Python就会假定它需要在嵌套的,全局的和内置的作用域中按此顺序查找它)。