我有以下模块:
主要.py
import my_import
my_import.a_func()
我的导入.py
FOO = "foo"
BAR = []
def a_func():
BAR.append("bar") #ok
FOO = FOO + "foo" #UnboundLocalError:
#local variable 'FOO' referenced before assignment
这可能是导入的原因,但是怎么办呢?
[编辑]
从我得到的答案来看,导入不是问题所在,但下面的内容仍然很奇怪:
FOO = "foo"
BAR = []
def a_func():
BAR.append("bar")
print(FOO)
a_func()
--> 打印“foo”
FOO = "foo"
BAR = []
def a_func():
BAR.append("bar")
print(FOO)
FOO = FOO + "foo"
a_func()
--> 失败并显示“UnboundLocalError:赋值前引用的局部变量‘FOO’”并且不打印“foo”
看起来解释器在实际运行代码之前正在当前范围内寻找分配。
请您参考如下方法:
当 Python 解析函数定义时,它会记录赋值语句左侧的所有变量名,例如
FOO = FOO + "foo"
它将所有这样的变量名注册为局部变量。
让我强调一下,赋值语句导致 Python 在解析函数定义 时将 FOO 注册为局部变量,而不是在调用函数时。所以稍后,当函数被调用时,即使是在赋值之前发生的对FOO的引用仍然引用局部变量并且可能引发UnboundLocalError .
def a_func():
BAR.append("bar")
print(FOO) #<--- "Freaky" UnboundLocalError occurs here!
FOO = FOO + "foo"
所以在a_func 中,FOO 是一个局部变量。在没有 print(FOO) 语句的情况下,Python 到达赋值并首先计算右侧。它遇到变量名 FOO,将其识别为 局部变量 并询问其值是多少?它没有任何值(value)!所以它引发了一个UnboundLocalError。
要修复,请使用 global FOO 声明 a_func 中的 FOO 引用全局变量:
FOO = "foo"
BAR = []
def a_func():
global FOO
BAR.append("bar") #ok
FOO = FOO + "foo" assignment
相比之下,BAR.append('bar') 起作用是因为 Python 首先查找变量 BAR —— 它不认为它是局部变量,因为有没有 BAR = ... 形式的赋值。它在全局范围内找到 BAR,然后查找它的 append 方法,然后改变 BAR。因此,您可以改变 BAR 但不能分配给 FOO(没有 global FOO 语句。)
