Skip to main content
 首页 » 编程设计

带导入的 Python 函数作用域

2025年05月04日16zhwl

我有以下模块:

主要.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 语句。)