Python条件句使变量变为无符号并引发`UnboundLocalError`

时间:2019-03-03 02:45:28

标签: python

所以当我开始面对这个问题时,我正在写一些条件语句。有人可以向我解释为什么此代码无法执行吗? (我简化了语义,使其更易于再现)

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中进行了测试。

2 个答案:

答案 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,因为您在比较后的一行中声明了另一个局部aif 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)

如果您希望函数内部的ab引用函数外部定义的变量,则可以执行以下操作:

a = 1
b = 2

def run():
    global a
    global b
    if a < b:
        a = b

run()