所以当我开始面对这个问题时,我正在写一些条件语句。有人可以向我解释为什么此代码无法执行吗? (我简化了语义,使其更易于再现)
a = 1
b = 2
def run():
if a < b:
a = b
run()
它引发一个UnboundLocalError: local variable 'a' referenced before assignment
。似乎是在if块内分配了变量,所以我将函数更改为:
def run():
if a < b:
b = a
然后消息是UnboundLocalError: local variable 'b' referenced before assignment
。
我不确定这是否是由于作用域,但是此代码正常工作:
def run():
print(a)
print(b)
有什么想法让我错过了Python的工作原理吗?如果是这样,请为这个愚蠢的问题感到抱歉,但我从事Python已有4年以上,以前从未见过。
在WSL中的Python 2.7.15rc1
和Windows中的Python 3.6.4
中进行了测试。
答案 0 :(得分:1)
您可能会错过有关变量范围的知识。
# Here is the global scope of module
def func():
# Here is the local scope of function
因此,在您的代码中,要在局部作用域中使用在全局作用域中声明的变量,您需要添加global
才能在局部作用域中调用它们。
a = 1
b = 2
def run():
global a
if a < b:
a = b
run()
如果没有在局部范围内声明全局变量,则会出现异常UnboundLocalError
,因为您在比较后的一行中声明了另一个局部a
:if a < b
。语法检查将在执行代码之前在本地范围内验证变量声明。因此,b
不需要在本地范围内是全局的,但a
则需要。
或者另一种方式是使用globals()
来调用模块杠杆变量。但这不会改变全局范围内变量的值。
a = 1
b = 2
def run():
if globals()['a'] < b:
a = b # local scope a = 2
run()
# global scope a = 1
答案 1 :(得分:0)
如果您希望函数内部的a
和b
引用函数外部定义的变量,则可以执行以下操作:
a = 1
b = 2
def run():
global a
global b
if a < b:
a = b
run()