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

2024-05-19 00:21:36 发布

您现在位置: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中测试


Tags: run代码iflocaldef语义情况variable
2条回答

您可能会错过变量范围的知识

# 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

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

a = 1
b = 2

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

run()

相关问题 更多 >

    热门问题