gpt4 book ai didi

python - 首次使用后重新分配时局部变量出现 UnboundLocalError

转载 作者:行者123 更新时间:2023-12-05 07:32:19 24 4
gpt4 key购买 nike

以下代码在 Python 2.5 和 3.0 中都按预期工作:

a, b, c = (1, 2, 3)

print(a, b, c)

def test():
print(a)
print(b)
print(c) # (A)
#c+=1 # (B)
test()

但是,当我取消注释 (B) 行时,我在 (A) 行收到 UnboundLocalError: 'c' not assignedab 的值打印正确。我不明白:

  1. 为什么在 (A) 行会因为 (B) 后面的语句而引发运行时错误?

  2. 为什么变量 ab 按预期打印,而 print(c) 引发错误?

我能想到的唯一解释是赋值 c+=1 创建了一个local 变量 c,它优先于全局 c。但是变量如何在它存在之前“窃取”作用域呢?为什么 c 显然是本地的?


另见 Using global variables in a function对于仅关于如何从函数内重新分配全局变量的问题,以及 Is it possible to modify a variable in python that is in an outer (enclosing), but not global, scope?用于从封闭函数(闭包)重新分配。参见 Why isn't the 'global' keyword needed to access a global variable?对于 OP 预期错误但没有得到错误的情况,通过简单地访问全局而不使用 global 关键字。

最佳答案

Python 以不同方式处理函数中的变量,具体取决于您是从函数内部还是外部为它们赋值。如果一个变量在一个函数中赋值,它默认被视为一个局部变量。因此,当您取消注释该行时,您正在尝试在为局部变量 c 分配任何值之前引用它。

如果你想让变量c引用函数前赋值的全局c = 3,把

global c

作为函数的第一行。

至于python 3,现在有

nonlocal c

您可以使用它来引用最近的包含 c 变量的封闭函数范围。

关于python - 首次使用后重新分配时局部变量出现 UnboundLocalError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51296579/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com