我建议您将该变量保留在全局范围内并使用global语句访问它。
关键字global允许您在全局命名空间中引用一个变量,尽管函数调用者上存在另一个同名变量。
例如:这将打印“tangerine”
def foo():
def bar():
return fruit
fruit = "tangerine"
return bar2()
fruit = "banana"
print(foo()) # will print "tangerine"
但这将打印“香蕉”。
def foo2():
def bar2():
global fruit # fetch me the fruit in the global scope
return fruit
fruit = "tangerine"
return bar2()
fruit = "banana"
print(foo2()) # will print "banana"
如果没有 global 关键字,解释器将遵循“LEGB 规则”来查找您尝试引用的变量:
- 本地范围:首先,它将在本地范围内搜索变量,即执行函数语句的范围。每次调用函数时都会创建局部范围。
- 封闭范围:其次,解释器将在“封闭函数局部变量”中查找变量,即插入(声明)函数的函数。这就是在bar()内的return fruit语句中找到fruit变量的地方。
- 全局:如果在上面的命名空间中找不到变量,python 将尝试在全局变量中找到它。global语句的使用迫使 python 只在全局范围内查找它,因此跳过了 1 和 2。
- B uiltins:最后,python 会尝试在内置函数和常量中查找变量。这里没有魔法。
如果上述所有搜索都找不到变量名,python 将引发NameError异常:
$ NameError: name 'fruit' is not defined
然后你可以这样做:
def choosingFunction():
global option
if option == 0:
doThis()
elif option == 1:
doThat()
elif option == 2:
doTheOtherOne()
else:
doWhateverYouFeelLike()
>> option = 2
>> import choosingModule
>> choosingModule.choosingFunction()
请记住,依赖调用你的模块中存在的全局变量被认为是一种非常糟糕的做法,并且不能用于任何严重的事情。;)
有关global语句的更多信息,请查看文档:Python 3.x和Python 2.7。有关范围和命名空间规则的信息,请查看此处(Python 3.x)或此处(Python 2.7)。