在 Python 中赋值前引用的局部变量
Local variable referenced before assignment in Python
Python“UnboundLocalError: Local variable referenced before assignment”发生在我们在函数中引用局部变量之前为其赋值时。要解决该错误,请在函数定义中将变量标记为全局变量,例如global my_var
。
下面是错误如何发生的示例。
主程序
name = 'Alice' def example(): # ⛔️ UnboundLocalError: local variable 'name' referenced before assignment print(name) name = 'Bob' example()
我们name
在函数中为变量赋值。
这使得
name
变量成为函数的局部变量,并且局部变量遮蔽了全局范围内的变量。 name
要解决该错误,请将变量标记为global
您的函数定义。
主程序
name = 'Alice' def example(): # 👇️ mark global global name print(name) name = 'Bob' example() # 👉️ 'Alice' example() # 👉️ 'Bob'
如果变量在函数体中被赋值,则它是局部变量,除非明确声明为global
.
请注意,您可以name
从函数内部引用全局变量,但如果您在函数主体中为变量赋值,则局部变量会覆盖全局变量。
主程序
name = 'Alice' def example(): # ✅ this is ok print(name) example() # 👉️ 'Alice'
如果您有一个嵌套函数并试图从外部函数为局部变量赋值,请使用nonlocal
关键字。
主程序
def outer(): # 👇️ initialize message variable message = '' def inner(): # 👇️ Mark message as nonlocal nonlocal message message = 'hello world' print(message) inner() print(message) # 👉️ "hello world" outer()
关键字允许我们使用nonlocal
封闭函数的局部变量。
请注意,我们必须在函数中初始化
message
变量,但我们能够在函数中更改它的值。 outer
inner
如果我们不使用该nonlocal
语句,对该print()
函数的调用将返回一个空字符串。
主程序
def outer(): # 👇️ initialize message variable message = '' def inner(): # 👇️ declares message in inner's scope message = 'hello world' print(message) inner() print(message) # 👉️ "" outer()
使用global
关键字的另一种解决方案是从函数返回一个值并使用该值重新分配全局变量。
主程序
name = 'Alice' def example(): print(name) # 👉️ 'Alice' new_name = 'Bob' return new_name result = example() print(result) # 👉️ 'Bob' name = result print(name) # 👉️ 'Bob'
我们只需返回最终用于分配给name
全局变量的值。
您还应该考虑将全局变量作为参数传递给函数。
主程序
name = 'Alice' def example(first): full_name = first + ' Smith' return full_name result = example(name) print(result) # 👉️ 'Alice Smith'
我们将name
全局变量作为参数传递给函数。
当我们为一个作用域中的变量赋值时,该变量成为该作用域的局部变量,并隐藏外部作用域中具有相同名称的变量。
如果我们在函数中为变量赋值,除非显式声明为 ,否则该变量被假定为局部变量global
。
结论
Python“UnboundLocalError: Local variable referenced before assignment”发生在我们在函数中引用局部变量之前为其赋值时。要解决该错误,请在函数定义中将变量标记为全局变量,例如global my_var
。