虽然我将该结构纳入模块范围:
def test():
return 1
test = test()
print test
效果很好。
但如果我在功能范围内尝试相同:
def test():
return 1
def go():
test = test()
print test
我得到UnboundLocalError
:
Traceback (most recent call last):
File "my.py", line 16, in <module>
go()
File "my.py", line 12, in go
test = test()
UnboundLocalError: local variable 'test' referenced before assignment
我有点困惑。为什么这些行为之间存在这种差异?
答案 0 :(得分:0)
在此示例中,test
在同一范围内定义,因此使用test
将引用该函数。
def test():
return 1
test = test()
print test
虽然在此示例中,使用test=
开始一行会立即删除对该函数的本地引用,并将其标记为尚未分配,因此当您使用test()
时,它会告诉您变量未分配。
def test():
return 1
def go():
# here
test = test()
print test
要获得与第一个示例类似的行为,您可以添加nonlocal
或global
我标记为# here
的位置,我相信您会得到相同的行为。
答案 1 :(得分:0)
在第二个例子中,Python试图在赋值之前引用test
。
根据您的要求,我们需要将test
声明为nonlocal
或global
。
以下是修改后的代码:
def test():
return 1
def go():
global test
test = test()
print test
输出
win32上的Python 2.7.9(默认,2014年12月10日,12:24:55)[MSC v.1500 32位(英特尔)] 输入“copyright”,“credits”或“license()”以获取更多信息。
================================ RESTART ============== ==================
1
答案 2 :(得分:0)
问题是当你在'go'函数作用域中将'test'定义为局部变量时,它会在函数namespace中创建新变量。所以,当你在函数内部调用'test()'时,它试图访问它的本地副本不是全局函数。以下代码应该可以工作。
def test():
return 1
def go():
local_function_variable = test()
print local_function_variable
go()