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

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

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   621  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品创新与市场竞争力的关键方法。然而,实践过程中,不少企业因对IPD理解不深或执行不当,而陷入了一系列常见误区。本文旨在剖析这些误区,并提出相应的规避策略,以期帮助企业更有效地运用IPD流程,加速产品上市,提升市场成功率。误区一:IPD流程僵化,缺乏灵活性IPD流程强...
华为IPD流程   6  
  PDCP在IPD中的角色:8个关键要点在集成产品开发(IPD)流程中,PDCP(Plan Decision Check Point,计划决策评审点)扮演着至关重要的角色。作为产品开发过程中的一个重要里程碑,PDCP不仅决定了项目是否进入下一阶段,还确保了产品设计和关键流程的合理性、可行性和合规性。本文将深入探讨PDCP...
IPD结构化流程   10  
  在当今快速变化的商业环境中,企业为了保持竞争力,必须不断推出创新产品以满足市场需求。集成产品开发(IPD, Integrated Product Development)流程作为一种先进的研发管理模式,旨在通过跨部门协作、高效决策和快速迭代,加速产品从概念到市场的转化过程。成功实施IPD流程并非一蹴而就,它需要企业系统...
华为IPD流程   6  
  PDCP在IPD中的实施挑战与解决方案在集成产品开发(IPD)流程中,计划决策评审(PDCP)作为关键节点,对确保产品设计和关键流程的合理性、可行性及符合性起着至关重要的作用。然而,PDCP的实施并非一帆风顺,它面临着多方面的挑战。本文将深入探讨这些挑战,并提出相应的解决方案,以期为项目管理实践提供有价值的参考。一、P...
华为IPD流程   7  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用