模块范围和功能范围之间的差异

时间:2016-03-28 15:17:37

标签: python python-2.7 scope namespaces

虽然我将该结构纳入模块范围:

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

我有点困惑。为什么这些行为之间存在这种差异?

3 个答案:

答案 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

要获得与第一个示例类似的行为,您可以添加nonlocalglobal我标记为# here的位置,我相信您会得到相同的行为。

答案 1 :(得分:0)

在第二个例子中,Python试图在赋值之前引用test。 根据您的要求,我们需要将test声明为nonlocalglobal

以下是修改后的代码:

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()