以下代码在 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()
但是,当我取消注释 line (B) 时,我得到一个UnboundLocalError: 'c' not assignedat line (A) 。a和的值b打印正确。这让我完全困惑有两个原因:
UnboundLocalError: 'c' not assigned
a
b
为什么在 (A)行出现运行时错误,因为 (B) 行后面有一个语句?
为什么变量a并按b预期打印,而c引发错误?
c
我能想到的唯一解释是 局部 变量c是由 assignment 创建的c+=1,它甚至在创建局部变量之前就优先于“全局”变量c。当然,在变量存在之前“窃取”范围是没有意义的。
c+=1
有人可以解释这种行为吗?
Python 以不同的方式处理函数中的变量,具体取决于您是从函数内部还是外部为其赋值。如果在函数中分配了变量,则默认将其视为局部变量。因此,当您取消注释该行时,您试图c在分配任何值之前引用局部变量。
如果您希望变量c引用c = 3函数之前分配的全局,请将
c = 3
global c
作为函数的第一行。
至于python 3,现在有
nonlocal c
您可以使用它来引用最近的具有c变量的封闭函数范围。