为什么会发生此 UnboundLocalError(关闭)?[重复]

2024-11-22 08:47:00
admin
原创
159
摘要:问题描述:我在这里做错了什么?counter = 0 def increment(): counter += 1 increment() 上述代码抛出一个UnboundLocalError。解决方案 1:Python 没有变量声明,因此它必须自己确定变量的作用域。它通过一个简单的规则来实现这一点:如果...

问题描述:

我在这里做错了什么?

counter = 0

def increment():
  counter += 1

increment()

上述代码抛出一个UnboundLocalError


解决方案 1:

Python 没有变量声明,因此它必须自己确定变量的作用域。它通过一个简单的规则来实现这一点:如果在函数内部对变量进行赋值,则该变量被视为局部变量。[1] 因此,以下行

counter += 1

隐式地将counter局部变量设置为。但是,尝试执行此行时,将尝试在分配increment()局部变量之前读取该变量的值,从而导致。[2]counter`UnboundLocalError`

如果counter是全局变量,则该global关键字会有所帮助。如果increment()是局部函数和counter局部变量,则可以nonlocal在 Python 3.x 中使用。

解决方案 2:

您需要使用全局语句来修改全局变量计数器,而不是局部变量:

counter = 0

def increment():
  global counter
  counter += 1

increment()

如果在 中定义的封闭范围counter不是全局范围,则在 Python 3.x 上可以使用nonlocal 语句。在 Python 2.x 上的相同情况下,您将无法重新分配给非本地名称counter,因此您需要使其counter可变并修改它:

counter = [0]

def increment():
  counter[0] += 1

increment()
print counter[0]  # prints '1'

解决方案 3:

回答你主题行中的问题,*是的,Python 中有闭包,但它们只适用于函数内部,而且(在 Python 2.x 中)它们是只读的;你不能将名称重新绑定到其他对象(但如果对象是可变的,你可以修改其内容)。在 Python 3.x 中,你可以使用关键字nonlocal来修改闭包变量。

def incrementer():
    counter = 0
    def increment():
        nonlocal counter
        counter += 1
        return counter
    return increment

increment = incrementer()

increment()   # 1
increment()   # 2
  • 该问题最初询问的是 Python 中的闭包。

解决方案 4:

您的代码抛出的原因UnboundLocalError已在其他答案中得到很好的解释。

但在我看来,你正在尝试构建一些像 一样工作的东西itertools.count()

所以尝试一下,看看它是否适合你的情况:

>>> from itertools import count
>>> counter = count(0)
>>> counter
count(0)
>>> next(counter)
0
>>> counter
count(1)
>>> next(counter)
1
>>> counter
count(2)

解决方案 5:

Python 默认具有词法作用域,这意味着虽然封闭的作用域可以访问其封闭作用域中的值,但它不能修改它们(除非使用global关键字将它们声明为全局的)。

闭包将封闭环境中的值绑定到本地环境中的名称。然后本地环境可以使用绑定的值,甚至可以将该名称重新分配给其他内容,但无法修改封闭环境中的绑定。

在您的情况下,您尝试将其视为counter局部变量而不是绑定值。请注意,此代码将分配的值绑定x在封闭环境中,可以正常工作:

>>> x = 1

>>> def f():
>>>  return x

>>> f()
1

解决方案 6:

要修改函数内部的全局变量,必须使用 global 关键字。

当你尝试在没有线的情况下执行此操作时

global counter

在增量的定义内部,创建了一个名为 counter 的局部变量,以防止您弄乱整个程序可能依赖的计数器变量。

请注意,只有在修改变量时才需要使用全局;您可以从增量中读取计数器,而不需要全局语句。

解决方案 7:

尝试一下:

counter = 0

def increment():
  global counter
  counter += 1

increment()

解决方案 8:

Python 不是纯粹的词汇范围。

请参阅在函数中使用全局变量

以及关于 Python 变量范围的注释

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1247  
  IPD(Integrated Product Development)研发管理体系作为一种先进的产品开发管理模式,在众多企业中得到了广泛应用,助力企业提升产品开发效率、降低成本、增强市场竞争力。深入理解其核心要素,对于企业成功实施 IPD 研发管理体系至关重要。以下将对 IPD 研发管理体系的四大核心要素进行详细解析。...
IPD流程中的charter   19  
  IPD(Integrated Product Development)研发管理体系强调将产品开发视为一个完整的流程,从市场需求出发,整合企业的各种资源,实现产品的快速、高质量交付。在这个过程中,成本控制是至关重要的一环,它直接关系到产品的竞争力和企业的盈利能力。有效的成本控制能够确保在不牺牲产品质量和性能的前提下,降低...
IPD开发流程管理   22  
  IPD(Integrated Product Development)项目管理作为一种先进的产品开发管理模式,在众多企业中得到了广泛应用。它通过整合跨部门团队,实现从概念到产品上市的全流程高效管理,提升产品竞争力。深入探讨IPD项目管理的六个关键阶段,对于企业理解和运用这一模式,优化产品开发流程具有重要意义。概念阶段概...
IPD概念阶段   29  
  IPD(Integrated Product Development)流程管理作为一种先进的产品开发管理模式,旨在通过整合各种资源,实现产品开发的高效、协同与创新。在这一流程管理体系下,产品质量保障成为企业关注的核心要点之一。有效的产品质量保障策略不仅能够提升产品的市场竞争力,还能为企业赢得良好的声誉和客户忠诚度。接下...
华为IPD   24  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用