1

我有以下模块:

主文件

import my_import

my_import.a_func()

my_import.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”

看起来解释器在实际运行代码之前正在寻找当前范围内的分配。

4

3 回答 3

5

当 Python 解析函数定义时,它会记下赋值语句左侧的所有变量名,例如

FOO = FOO + "foo"

它将所有这些变量名注册为局部变量

让我强调一下,赋值语句导致 Python在解析函数定义FOO时注册为局部变量,而不是在调用函数时。所以稍后,当函数被调用时,即使在赋值之前发生的引用仍然引用局部变量并且可以引发.FOOUnboundLocalError

def a_func():
    BAR.append("bar")
    print(FOO)       #<--- "Freaky" UnboundLocalError occurs here!
    FOO = FOO + "foo" 

所以在里面a_func, FOO 是一个局部变量。在没有print(FOO)语句的情况下,Python 到达赋值并首先评估右侧。它遇到变量名 ,FOO将其识别为局部变量并询问其值是什么?它没有任何价值!所以它提出了一个UnboundLocalError.

要修复,请使用global FOO声明FOO内部a_func引用全局变量:

FOO = "foo"
BAR = []

def a_func():
   global FOO
   BAR.append("bar") #ok
   FOO = FOO + "foo" assignment

相反,它BAR.append('bar')之所以有效,是因为 Python 首先查找变量BAR——它不认为它是一个局部变量,因为没有对表单进行赋值BAR = ...。它BAR在全局范围内查找,然后查找其 append 方法,然后 mutates BAR。因此,您可以变异BAR但不能分配给FOO(没有global FOO语句。)

于 2013-04-04T12:47:40.327 回答
2

不,它与进口无关。即使在交互式解释器中,它也会发生在单个模块或脚本中。

一个最小的例子是

a = 1
def f():
    a = a + 1

这个赋值产生a了一个局部变量。在这种情况下,全局变量被遮蔽,因此无法访问。

global如果你想改变全局,你可以解决这种情况:

a = 1
def f():
    global a
    a = a + 1

或者如果您想在本地保留更改,则使用不同命名的本地变量:

a = 1
def f():
    b = a
    b = b + 1
于 2013-04-04T12:48:00.760 回答
0

我可能是错的,但 FOO 和 BAR 的范围可能是问题吗?看起来好像您进入了不同的范围。尝试在您的方法中将 FOO 和 BAR 标记为全局变量。

于 2013-04-04T12:50:32.287 回答