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

2024-11-22 08:47:00
admin
原创
162
摘要:问题描述:我在这里做错了什么?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 变量范围的注释

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1259  
  IPD(Integrated Product Development)流程管理作为一种先进的产品开发管理理念和方法,在提升企业创新能力方面发挥着至关重要的作用。它打破了传统产品开发过程中部门之间的壁垒,通过整合资源、优化流程,实现产品的快速、高效开发,为企业在激烈的市场竞争中赢得优势。IPD流程管理的核心概念IPD流程...
IPD流程中PDCP是什么意思   11  
  IPD(Integrated Product Development)流程管理作为一种先进的产品开发管理模式,旨在通过整合各种资源,实现产品的高效、高质量开发。在这一过程中,团队协作无疑是成功的关键。有效的团队协作能够打破部门壁垒,促进信息共享,提升决策效率,从而确保产品开发项目顺利推进。接下来,我们将深入探讨IPD流...
IPD培训课程   9  
  IPD(Integrated Product Development)研发管理体系作为一种先进的产品开发理念和方法,在众多企业中得到了广泛应用。它旨在打破部门壁垒,整合资源,实现产品开发的高效、协同与创新。在项目周期方面,IPD研发管理体系有着深远且多维度的影响,深入剖析这些影响,对于企业优化产品开发流程、提升市场竞争...
华为IPD流程   11  
  IPD(Integrated Product Development)流程管理是一种先进的产品开发管理模式,旨在通过整合企业的各种资源,实现产品的高效、高质量开发。它涵盖了从产品概念提出到产品退市的整个生命周期,对企业的发展具有至关重要的意义。接下来将详细阐述IPD流程管理的五个阶段及其重要性。概念阶段概念阶段是IPD...
IPD概念阶段   12  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用